【问题标题】:Web API - Mapping request URL and body parameters to method argumentsWeb API - 将请求 URL 和正文参数映射到方法参数
【发布时间】:2015-07-01 12:59:02
【问题描述】:

我应该先向你展示我的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 (/users),我想使用密钥 mcicero (/users/mcicero) 向实体发出 PUT 请求。

DTO 随请求负载一起发送,由[FromBody] 参数属性表示。

但是,我收到了 404 Not Found 响应,好像端点无法解析为有效路由。

这可能是什么问题?

【问题讨论】:

  • “Key”的实际类型是什么?
  • @hazjack 在这个例子中(UsersController),它的类型是string
  • 您是否仔细检查了 url / 端口?我认为它应该工作。我的类似案例效果很好:)
  • @hazjack 对我来说一切看起来都很正常。你是如何让它工作的?可能是因为三个配置的路由?

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


【解决方案1】:

在与这个几个小时斗争之后......我终于找到了解决问题的方法(如果这不好,请纠正我)

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

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2016-01-04
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多