1

Web APIとWebアプリケーションを並べて使用しようとしていますが、WebAPIルーティングに問題があります。

ルート構成は次のとおりです。

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

// Map this rule first
        config.Routes.MapHttpRoute(
            name: "WithActionApi",
             routeTemplate: "api/{controller}/{action}/"
         );

        //sets up the API route
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/"
            //,defaults: new { id = RouteParameter.Optional }
        );

これはWebアプリでは正常に機能し、/ api /controllerのみを含むWebAPIでも正常に機能しますが、/ api / controll/actionを呼び出すと正常に機能しません。

私が使用しているもの:

[HttpPost]
    [ActionName("ConfirmRequest")]
    public HttpResponseMessage ConfirmRequest(string guid, string type, PartiStatus status = PartiStatus.Yes)

アクションの動詞と名前を指定します。ルートデバッガー(Web APIでは機能しない)と、動作する(そしてクラッシュする)別のデバッガーを試しましたが、POSTアクションを機能させることができませんでした。

私はこのアクションをGETに変更することになり、それは正常に機能します。GETパラメーターはフレームワークがそれを理解するのに役立つと思います。

正しく動作させる方法がまだわかりません。(アクションへの個性マッピングなし)

4

2 に答える 2

1

Web API とルーティングに関する私の経験から、既定のアクションを一番下に置くのが最善です。また、「キャッチオール」を削除し、基本的な動詞 GET/PUT/POST/DELETE のコントローラーごとのデフォルトを設定しました。

このようなことを試してください

    config.Routes.MapHttpRoute(
        name: "WithActionApi",
        routeTemplate: "api/Target/ConfirmRequest/{id}",
        defaults: new { id = RouteParameter.Optional }
     );

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

サンプル呼び出しは次のようになります

POST api/Target/ConfirmRequest?guid={guid}&type={type}&status{status}

REST API 呼び出しをすばやくテストするときに、Fiddler と組み合わせて使用​​する便利な小さな Chrome アドイン Postman があります。URL と複数の環境を保存して、迅速なデバッグを行うことができます。

于 2013-03-20T00:06:13.690 に答える
0

問題の URL に対して実際に POST 要求を発行していることを確認してください。ルーティングが正しいように見えます。[HttpPost]属性を[HttpGet]に変更すると機能すると述べましたが、それに応じてリクエストを変更することについては言及していません。

アクションの URL に GET リクエストを発行し、ConfirmRequestその唯一のオーバーロードが[HttpPost]属性で装飾されている場合、リクエストはこのアクションにマップされません。

ほとんどのブラウザーには、HTTP 要求を詳細に調べることができるプロファイラーがあります ( Chrome の Network Panelなど)。リクエストがブラウザーからのものでない場合は、Fiddlerなどのスタンドアロン プロファイラーを試すことができます。

于 2013-03-13T18:35:53.360 に答える