2013-03-29 2 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와 비슷한 일이 잘 작동하기 때문에

난 그냥 혼란 스러워요 (I는 허용 동사를 지정할 필요가 없습니다) : 나는 설정과 관련이있다 생각 각종 게시물에서

[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 Studio에 내장 된 개발 서버를 사용하고 있습니다.

고마워요!

답변

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, 증상을 재현하려했지만 시도하지 못했습니다. 메서드 이름을 Put 및 PutToken으로 변경했는데 두 경우 모두 작동했습니다. 다시 시도하고이 대답을 수락하십시오. –