3

複数の変数を[HttpGet]ApiControllerアクションに渡すことはできますか?例えば:

[HttpGet]
public IPagedList<Something> GetAll(int? page, string sortOrder="")
{
...
}

を使用してテストしました

curl http://localhost:[port]/api/[controller]/GetAll?page=3&sortOrder=Name

しかし、アクションは呼び出されませんでした。返されるメッセージは次のとおりです。リクエストURIに一致するHTTPリソースが見つかりませんでした。何が悪かったのか?

- -アップデート - -

HttpActionContext.Request.RequestUri.Queryのクエリ文字列を確認するAbsoluteUriと、アンパサンドで切り捨てられ、。のみが表示されpage=3ます。

---更新の終了

また、1つの変数を試しました。

[HttpGet]
public IPagedList<Something> GetAll(int? page)
{
...
}

テストでは問題なく内部のブレークポイントに到達できます

curl http:// localhost:[port] / api / [controller] / GetAll?page = 3

ビューモデルも作成しました。

public class ListRequestModel
{
    public string SortOrder { get; set; }
    public string CurrentFilter { get; set; }
    public string SearchString { get; set; }
    public int PageNumber { get; set; }
}

アクションは次のようなものです。

[HttpGet]
public IPagedList<Something> GetAll(ListRequestModel model)
{
...
}

次にテストします

curl http:// localhost:[port] / api / [controller] / GetAll?PageNumber = 3&SortOrder = Name

今回は、中のブレークポイントに到達できるのは素晴らしいことです。ただし、モデルはnullであり、クエリ文字列にデータが入力されていません。

では、複数の変数をアクションメソッドに渡す正しい方法は何ですか?助けてください。ありがとうございました。

- - - - - アップデート - - - - - -

要求に応じて、RouteConfig.csファイル内のルーティングテーブルを以下に貼り付けます。

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        ); 

Global.asax.csAreaRegistration.RegisterAllAreas();前に移動しますが、でRouteConfig.RegisterRoutes(RouteTable.Routes);始まるエリアルートはありませんapi。このApiControllerに関する他のすべてのテストは、問題なく動作を開始できます。

4

4 に答える 4

1

ルーティングとセットアップは問題ありません。そしてもちろん、コントローラーに複数の引数を渡すことができます。

&Linuxシェルでは特別な意味があるため、Linuxfooを改善する必要があります...

ウィキペディアから:

  • 一部のUnixシェルは、メタ文字としてアンパサンドを使用します。
  • POSIX標準のshシェルなど、一部のUnixシェルは、アンパサンドを使用してバックグラウンドでプロセスを実行し、ファイル記述子を複製します。
  • Bashでは、アンパサンドは単語の分離、コマンド履歴の制御、ファイル記述子の複製、論理演算の実行、ジョブの制御、および正規表現への参加を行うことができます。

&したがって、コマンドのバックラッシュでアンパサンドをエスケープする必要があり\ます

curl http://localhost:[port]/api/[controller]/GetAll?page=3\&sortOrder=Name

""または、URLを引用符で囲みます。

curl "http://localhost:[port]/api/[controller]/GetAll?page=3&sortOrder=Name"
于 2012-08-29T20:48:23.083 に答える
0

アクションベースのルーティングを使用していない場合は、間違っています。次のことを試してください。

curl http://localhost:[port]/api/[controller]?page=3&sortOrder=Name

一方、WebAPIアプリケーションとASP.NETMVCを同じコンテキストで実行している場合は、MVCルートの前にWebAPIルートを登録してください。それ以外の場合、デフォルトのMVCルートはすべてのWeb APIリクエストをキャッチし、おそらく404を返します。

于 2012-08-29T13:32:24.210 に答える
0

ルートHttpRouteCollectionも登録してみてください。

于 2012-08-29T20:22:39.693 に答える
-2

あなたの例では:

[HttpGet]
public IPagedList<Something> GetAll(ListRequestModel model)
{
...
}

それは決して機能しません、あなたはモデルを得ることができません、それはPOST/PUTされなければなりません。

于 2012-08-29T20:31:20.257 に答える