我应该首先向您展示我的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
响应,好像无法将端点解析为有效路由。
这可能是什么问题?
答案 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>