为什么这个Web API路由不支持Delete HTTP方法?

时间:2016-01-14 17:42:26

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

我有一个Web API控制器ClientController,我有一个方法ResetAllProgress。我想将路径DELETE上的api/client/progress HTTP谓词映射到此方法。

我正在使用AttributeRouting用于此目的因为我使用Web API 1.因此我在我的方法中添加了一个属性:[DELETE("api/client/progress", ControllerPrecedence = 1)]

我在启动期间暂停了我的应用程序,并发现Routes集合中存在相应的路由。下面是IHttpRoute对象的相关部分的JSON序列化:

{
    Constraints: {
        inboundHttpMethod: {
            AllowedMethods: ["DELETE", "OPTIONS"]
        }
    },
    DataTokens: {
        httpMethods: ["DELETE", "OPTIONS"]
    }
    Defaults: {
        controller: ClientController,
        action: ResetAllProgress
    },
    RouteTemplate: "/api/client/progress",
    Url: "api/client/progress"
}

但是,当我尝试向[{1}}发起DELETE来电时,我收到 405 Method Not Allowed

  

{     “消息”:“请求的资源不支持http方法'DELETE'。”   }

如果我使用属性api/client/progress来装饰ResetAllProgress方法,则对[AcceptVerbs("DELETE")]的调用会成功。据推测,如果另一个路由映射器存在,则会选择该属性,但我想将其专门路由到api/client/*。我尝试添加api/client/progress来抵消这种情况,但之后路线根本没有注册。

但是,当我向[NonAction]发出POST方法时,我会遇到异常:

  

找到符合请求的多项操作:

     

MyCompany.Api.ClientController类型上的System.Net.Http.HttpResponseMessage Post(MyCompany.Models.ViewModel.ClientViewModel)

     

System.Net.Http.HttpResponseMessage类型MyCompany.Api.ClientController上的ResetAllProgress()

     

MyCompany.Api.ClientController类型上的System.Net.Http.HttpResponseMessage ChangePassword(MyCompany.Models.ViewModel.ChangePasswordModel)

     

MyCompany.Api.ClientController类型上的Void SetDemo(MyCompany.Api.DemoViewModel)

该异常中的其他方法是映射到api/client/progress路由 - 或者不应该......我完全没有想法,我该怎么做才能出来了?

0 个答案:

没有答案