405使用AttributeRouting.PUTAttribute时除非我还包含HttpPutAttribute

Tha*_*had 5 asp.net-web-api attributerouting

我有一个MVC项目,我试图更新以包括WebApi.为了获得所需的路由,我们使用AttributeRouting.除了返回405的[PUT]之外,所有调用似乎都正确路由.我已经简化了控制器和操作,并且仍然使用[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);
        }
}
Run Code Online (Sandbox Code Playgroud)

AttributeRouting.Core 3.5.6版,AttributeRouting.Core.Http,AttributeRouting.Core.Web,AttributeRouting.WebApi

MVC4

未安装WebDAV.

Kir*_*lla 6

你所看到的是预期的行为.默认情况下,POST如果操作名称没有带有"Get","Post","Put","Delete"等动词的前缀,则Web API中的Action Selector假定操作为动词.

现在即使你[PUT("Statuses/{siteId}")]明确指定了属性它也不起作用,因为,Action选择器从System.Web.HttpHttpGetAttribute,HttpPostAttribute,HttpPutAttribute等命名空间查找属性.

由于AttributeRouting的PUTAttribute不属于上述类型,因此Action选择器不会考虑它,仍然认为它是默认值,即POST.所以你的HttpPut属性的解决方法是正确的.