我们有一个 MVC 项目,我正在尝试更新该项目以包含 WebApi。为了获得所需的路由,我们使用了 AttributeRouting。除了返回 405 的 [PUT] 之外,所有调用似乎都正确路由。我已经简化了 Controller 和操作,并且仍然收到带有 [PUT] 的错误,除非我还包括 [HttpPut]。不知道我错过了什么。
[RoutePrefix("api/Sites")]
public class SitesController : BaseApiController
{
[POST("")]
public bool CreateSite(SiteSignupArgs args)
{
...
}
[GET("Statuses")]
public IList<SiteAuditViewModel> GetStatuses()
{
...
}
[PUT("Statuses/{siteId}")]
[HttpPut] // This is required or 405 is returned
public HttpResponseMessage UpdateStatus(string siteId, UpdateStatusArgs args)
{
...
}
[DELETE("Statuses/{siteId}")]
public HttpResponseMessage Delete(string siteId)
{
return Request.CreateResponse(HttpStatusCode.OK);
}
}
AttributeRouting.Core、AttributeRouting.Core.Http、AttributeRouting.Core.Web、AttributeRouting.WebApi 3.5.6 版
MVC4
未安装 WebDAV。
最佳答案
您所看到的是预期的行为。默认情况下,Web API 中的 Action 选择器假定 Action 是动词 POST
如果 Action 名称没有带有动词前缀,如“Get”、“Post”、“Put”、“Delete”等。
现在即使您指定了 [PUT("Statuses/{siteId}")]
它也不起作用明确的属性,因为操作选择器从 System.Web.Http
中查找属性命名空间,如 HttpGetAttribute、HttpPostAttribute、HttpPutAttribute 等。
由于 AttributeRouting 的 PUTAttribute 不是上述类型,Action selector 不考虑它,仍然认为它是默认的,即 POST
.所以你的解决方法是 HttpPut
属性正确。
关于asp.net-web-api - 405 使用 AttributeRouting.PUTAttribute 时,除非我还包含 HttpPutAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17196731/