2013-03-29 194 views
5

我用我的网络API(MVC 4)AttributeRouting。请求的资源不支持HTTP方法“PUT”

为什么这样吗?

[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动词)。

哦,我使用内置的开发服务器视觉工作室。

谢谢你们!

回答

6

在这link他们描述的POST方法是默认的,如果没有任何行动匹配。所以这就是为什么它仍然适用于没有HttpPost属性的CreateToken()方法。 AcceptVerbs,HttpDelete,HTTPGET,HttpHead,HttpOptions,HttpPatch,HttpPost,或HttpPut:

  • 可以与属性指定HTTP方法。
  • 否则,如果控制器方法的名称以“Get”,“Post”,“Put”,“Delete”,“Head”,“Options”或“Patch”开头,那么按照约定, HTTP方法。
  • 如果上述的,该方法支持POST。
+0

嗨,谢谢你的解释。是的,我知道我可以指定允许的HTTP方法(请参阅第一个片段)。我也这么认为,如果我只是将我的方法从“UpdateToken”重命名为“PutToken”(尽管听起来不太好),我不需要[AcceptVerbs]属性。但是我愿意。也许这是由于AttributeRouting(在我的文章的第一句中提到)。这其实并不是什么大事。我可以在设置[AcceptVerbs]属性的地方居住,只要我需要它们。不会那么多。我只是希望我可以通过调整我的web.config来忘记这一点。再次感谢! – Ingmar

+0

@IngmarBode,我试图重现你的症状,但不能 - 我改变了方法名放和PutToken,并在这两种情况下工作。请重试并考虑接受此答案。 –

相关问题