0

単一のルートを使用して、パラメーター名に基づいて異なるアクションを呼び出す方法を教えてください。

私はフォローする必要があります

/api/v1/user
GET
key=dfddg&secret=fafassaf&query=select id from user where user like '%ggg%'

/api/v1/user
GET
key=dfddg&secret=fafassaf&ids=fadfdafdsf,faffasfasfsf,asfasfasfasfas,asfasfasfasf

私は次のコードを書いています

[RoutePrefix("api/v1/user")]
public class UserController : ApiController
{
    [GET("")]
    public String GetAllUsers(String key, String secret, String query)
    {
        return "GetAllUsers";
    }

    [GET("")]
    public String GetLookupUserIds(String key, String secret, String ids)
    {
        return "GetLookupUserIds";
    }

ただし、最初のケースは正常に機能しますが、2番目のケースは例外をスローします

{
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:14823/api/v1/user?key=rhdgsdgdsr&secret=fhdgdgdfhdfh&ids=fdfdf,dfadfff'.",
    "MessageDetail": "No action was found on the controller 'User' that matches the request."
}
4

1 に答える 1

1

ここでの問題は、リクエストがapi/v1/userルート テーブルの 1 番目のルートと一致することだと思います。 table は、どの属性ルーティングがそれにアクションを追加しているかに基づいたリフレクション順序である可能性があります。(ルートテーブルGlobalConfiguration.Configuration.Routesエントリがどのように見えるかを確認できます)。

属性ルーティングは、action変数にアクション名の値を割り当てることによってルートを追加します。actionWeb API のアクション選択には、変数が割り当てられていることがわかると、同じ名前のアクションのリストの中から最も一致するアクションを探しようとするロジックがあります (あなたのようなアクション オーバーロード シナリオ)。

次のことを試すことができます。

  1. 属性を使用して、上記の両方のメソッドに同じアクション名ActionNameを 付けます。

  2. 1.が意味をなさない場合は、おそらくアクションに別のルート テンプレートを使用できます。

于 2013-10-10T13:19:02.947 に答える