Web API - 将请求URL和正文参数映射到方法参数

时间:2015-07-01 12:59:03

标签: c# asp.net .net asp.net-web-api routing

我应该首先向您展示我的RouteConfig.cs

public static void Register(HttpConfiguration configuration)
{
     configuration.Routes.MapHttpRoute("noKey",
                                       "{controller}");

     configuration.Routes.MapHttpRoute("oneKey",
                                       "{controller}/{id}");

     configuration.Routes.MapHttpRoute("twoKeys",
                                       "{controller}/{firstKey}/{secondKey}");

     // SomeProperty -> someProperty
     var jsonFormatter = configuration.Formatters.OfType<JsonMediaTypeFormatter>().First();
     jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}

我有以下基类:

public abstract class RestController<Key, PostDTO, PutDTO, QueryData>
{
      // ...

      protected abstract Task<IHttpActionResult> Put(Key id, PutDTO dto);

      // ...

      [HttpPut]
      [ValidateArgument("dto")]
      public async Task<IHttpActionResult> BasePut([FromUri] Key id, [FromBody] PutDTO dto)
      {
            return await Put(id, dto);
      }
}

ValidateArgumentAttribute是我制作的自定义属性,用于验证输入DTO。

我试图像这样调用这个方法:

HTTP PUT - /users/mcicero

正如您所看到的,我有一个UsersController(/个用户),我想通过密钥mcicero(/ users / mcicero)向实体发出PUT请求。

DTO沿请求有效负载发送,由[FromBody]参数属性表示。

然而,我得到404 Not Found响应,好像无法将端点解析为有效路由。

这可能是什么问题?

1 个答案:

答案 0 :(得分:1)

用这个打了几个小时 ......我终于找到了问题的解决办法(纠正我,如果这很糟糕)

我必须为verb="*"处理程序启用所有动词(ExtensionlessUrlHandler-Integrated-4.0):

<强>的Web.config

  <system.webServer>
    <handlers>
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>