10

WebApiConfig.csのルーティング構成は次のとおりです。

config.Routes.MapHttpRoute(
    name: "DefaultApiPut",
    routeTemplate: "api/{controller}",
    defaults: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) }
);


config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Delete) }
);

これが私のコントローラーです:

public class MyController : ApiController {
    [HttpPut]
    public void Put()
    {
        //blah
    }
}

どういうわけか、クライアントがURLを使用してPUTリクエストを送信すると、それはまだのメソッドに/api/myController/12345マップされます。リソースが見つからないなどのエラーが発生することが予想されます。PutMyController

Putメソッドがパラメータなしでリクエストのみを受け入れるように強制するにはどうすればよいですか?

前もって感謝します!

4

2 に答える 2

10

これは、ルートのhttpメソッドを制約するために機能します。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
    config.Routes.MapHttpRoute(
       name: "LocationApiPOST",
       routeTemplate: "api/{orgname}/{fleetname}/vehicle/location",
       defaults: new { controller = "location" }
       constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }
   );

    config.Routes.MapHttpRoute(
       name: "LocationApiGET",
       routeTemplate: "api/{orgname}/{fleetname}/{vehiclename}/location/{start}",
       defaults: new { controller = "location", start = RouteParameter.Optional }
       constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
   );

   ...

}
于 2013-10-09T19:35:36.603 に答える
9

httpMethod制約をに入れていますdefaultsが、にあるはずですconstraints

defaultsリクエストにルーティングパラメータとしてそれらの一部またはすべてが含まれていない場合のデフォルト値は何であるかを示しています(動詞の場合、すべてのHTTPリクエストには常にプロトコルの一部として動詞があるため、これは無意味です)。constraintsルートをアクティブにするルート値の組み合わせを制限します。これは、実際に実行しようとしていることです。

[HttpPut]参考までに、この単純な/標準のルーティングでは、APIコントローラーの属性も必要ありません。これは、動詞をコントローラーメソッドにマップするHTTPルーティングによってすでに処理されています。

于 2012-09-27T03:41:12.577 に答える