【问题标题】:Requested resource does not support http method "PUT"请求的资源不支持 http 方法“PUT”
【发布时间】:2013-03-19 23:02:33
【问题描述】:

我将 AttributeRouting 与我的 Web API (MVC 4) 一起使用。

为什么会这样?

    [AcceptVerbs("PUT")]
    [PUT("api/v1/tokens/current")]
    public MemoryToken UpdateToken([FromBody] DeviceTokenViewModel viewModel)
    {...}

而这个没有?

    [PUT("api/v1/tokens/current")]
    public MemoryToken UpdateToken([FromBody] DeviceTokenViewModel viewModel)
    {...}

错误信息:请求的资源不支持 http 方法“PUT”。 为什么我必须明确接受 PUT 动词?

我只是感到困惑,因为与 POST 类似的东西可以正常工作(我不必指定接受的动词):

 [POST("api/v1/tokens")]
 public MemoryToken CreateToken()
 {...}

从其他各种帖子中,我相信这与我的 web.config 中的设置有关。 Web 服务器部分目前如下所示:

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="AttributeRouting" path="routes.axd" verb="*" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
</handlers>

我尝试了一些方法,例如删除 WebDav 之类的。但到目前为止没有任何效果(除非在注释中明确允许 PUT 动词)。

哦,我正在使用 Visual Studios 内置的开发服务器。

谢谢大家!

【问题讨论】:

    标签: asp.net-web-api attributerouting


    【解决方案1】:

    link 中,他们将 POST 方法描述为如果没有任何操作匹配,则为默认方法。所以这就是为什么它仍然适用于没有 HttpPost 属性的 CreateToken() 方法。

    • 您可以使用属性指定 HTTP 方法:AcceptVerbs、HttpDelete、HttpGet、HttpHead、HttpOptions、HttpPatch、HttpPost 或 HttpPut。
    • 否则,如果控制器方法的名称以“Get”、“Post”、“Put”、“Delete”、“Head”、“Options”或“Patch”开头,则按照惯例,该操作支持HTTP 方法。
    • 如果以上都不是,则该方法支持 POST。

    【讨论】:

    • 您好,感谢您的解释。是的,我知道我可以指定允许的 HTTP 方法(参见第一个 sn-p)。而且我也这么认为,如果我只是将我的方法从“UpdateToken”重命名为“PutToken”(虽然这听起来不太好),我就不需要 [AcceptVerbs] 属性。但是我愿意。也许这是由于 AttributeRouting (在我的帖子的第一句话中提到的)。这其实没什么大不了的。我可以在任何需要的地方设置 [AcceptVerbs] 属性。不会那么多。我只是希望我可以通过稍微调整一下 web.config 来忘记这一点。再次感谢!
    • @IngmarBode,我试图重现您的症状,但不能——我将方法名称更改为 Put 和 PutToken 并且在这两种情况下都有效。请重试并考虑接受此答案。
    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 2017-04-24
    • 1970-01-01
    • 2018-03-21
    • 2018-06-24
    • 2014-08-12
    • 2012-09-27
    相关资源
    最近更新 更多