所请求的资源不支持HTTP方法“PUT”。

6

我正在使用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设置中。目前,网页服务器部分的设置如下:

<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内置开发服务器。

谢谢大家!

1个回答

6
在这个链接中,他们将POST方法描述为默认方法,如果没有匹配的操作,则使用默认方法。所以即使在没有HttpPost属性的情况下,您的CreateToken()方法仍然有效。
  • 您可以使用属性指定HTTP方法: AcceptVerbs、HttpDelete、HttpGet、HttpHead、HttpOptions、HttpPatch、HttpPost或HttpPut。
  • 否则,如果控制器方法的名称以"Get"、"Post"、"Put"、"Delete"、"Head"、"Options"或"Patch"开头,那么按照惯例,该操作支持该HTTP方法。
  • 如果以上都不是,则该方法支持POST。

你好,感谢你的解释。是的,我知道我可以指定允许的HTTP方法(请参见第一个代码片段)。我也认为如果我只是将我的方法从“UpdateToken”重命名为“PutToken”(虽然这听起来不太好),我就不需要[AcceptVerbs]属性了。但事实并非如此。也许这是由于AttributeRouting(在我帖子的第一句话中提到)。这其实不是什么大问题。我可以在需要它们的任何地方设置[AcceptVerbs]属性。不会太麻烦。我只是希望通过微调我的web.config来忘记这个问题。再次感谢! - Ingmar
@IngmarBode,我尝试重现你的症状,但是失败了——我将方法名更改为Put和PutToken,两种情况下都可以工作。请再试一次并考虑接受这个答案。 - Pete Klein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接