2013-03-29 98 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,並在這兩種情況下工作。請重試並考慮接受此答案。 –

相關問題