5

我们有一个 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);
        }
}

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

MVC4

未安装 WebDAV。

4

1 回答 1

6

您所看到的是预期的行为。默认情况下,Web API 中的动作选择器假定动作是动词POST,如果动作名称没有带有动词如“Get”、“Post”、“Put”、“Delete”等的前缀。

现在,即使您[PUT("Statuses/{siteId}")]明确指定了属性,它也不起作用,因为动作选择器会从System.Web.Http命名空间中查找属性,例如 HttpGetAttribute、HttpPostAttribute、HttpPutAttribute 等。

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

于 2013-06-19T17:00:49.583 回答