Asp.net web api 请求的资源不支持http方法“;把「;

Asp.net web api 请求的资源不支持http方法“;把「;,asp.net-web-api,attributerouting,Asp.net Web Api,Attributerouting,我正在将AttributeRouting与我的Web API(MVC4)一起使用 为什么这样做有效 [AcceptVerbs("PUT")] [PUT("api/v1/tokens/current")] public MemoryToken UpdateToken([FromBody] DeviceTokenViewModel viewModel) {...} 而这个没有 [PUT("api/v1/tokens/current")] public

我正在将AttributeRouting与我的Web API(MVC4)一起使用

为什么这样做有效

    [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类似的东西可以很好地工作(我不必指定可接受的动词):

从其他各种帖子中,我认为这与我的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 Studio内置的开发服务器

谢谢大家

在本文中,他们将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]属性了。但我知道。也许这是由于属性运算(在我文章的第一句中提到)。其实没什么大不了的。我可以在需要的地方设置[AcceptVerbs]属性。不会那么多。我只是希望通过稍微调整一下我的web.config可以忘记这一点。再次感谢@IngmarBode,我试图重现您的症状,但无法--我将方法名称更改为Put和PutToken,并且在这两种情况下都有效。请再试一次并考虑接受这个答案。
<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>