최근에 Visual Studio 2010에서 Visual Studio 2012 RC로 업그레이드했습니다. 설치 관리자는 이제 Visual Studio에서 기본 웹 서버로 사용하는 IIS 8 Express도 설치합니다.
IIS 8에서 PUT 및 DELETE 동사를 사용하는 WEB API 요청을 차단하고 있습니다. IIS는 405 오류를 반환합니다 The requested resource does not support http method 'PUT'
.
과거에 사람들이 이것에 문제가 있다는 것을 알고 스택 오버플로에 몇 가지 메시지가 있습니다. IIS 7 Express에서 솔루션은 WebDav를 제거하는 것이 었습니다. 불행히도 IIS 8에서는 그렇게 할 수 없습니다.
applicationhost.config에서 WebDav 섹션을 편집하려고 시도했지만 도움이되지 않았습니다. 예를 들어 <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
구성 파일에서 제거 했습니다.
나는 이것에 너무 오래 보냈다. PUT 및 DELETE를 활성화하는 간단한 방법이 있어야합니까?
답변
괜찮아. 나는 마침내 이것의 바닥에 도착했다. IIS8에서 PUT 및 DELETE 동사가 올바르게 작동하려면 일부 후프를 뛰어 넘어야합니다. 실제로 VS 2012의 릴리스 후보를 설치하고 새 WEB API 프로젝트를 작성하면 샘플 PUT 및 DELETE 메소드가 기본적으로 404 오류를 리턴 함을 알 수 있습니다.
웹 API와 함께 PUT 및 DELETE 동사를 사용하려면 다음과 같이 % userprofile % \ documents \ iisexpress \ config \ applicationhost.config를 편집하고 ExtensionlessUrl 핸들러에 동사를 추가해야합니다.
이 줄을 바꾸십시오 :
<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
에:
<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
위의 사항 외에도 WebDAV가 요청을 방해하지 않아야합니다. applicationhost.config에서 다음 행을 주석 처리하여 수행 할 수 있습니다.
<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" />
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
또한 기본 웹 API 규칙은 메소드 이름이 호출 된 HTTP 동사와 동일해야한다는 것입니다. 예를 들어 HTTP 삭제 요청을 보내는 경우 기본적으로 메소드 이름은 Delete로 지정해야합니다.
답변
아래와 같이 Web.Config 파일을 변경하십시오. 그것은 매력처럼 행동 할 것입니다.
노드에서 <system.webServer>
아래 코드 부분 추가
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
추가하면 Web.Config는 다음과 같습니다.
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
<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" />
</handlers>
</system.webServer>
답변
WebDAV를 제거하면 내 경우에는 완벽하게 작동합니다.
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.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" />
</handlers>
iis 또는 machine.config를 통해 문제를 해결하는 대신 항상 web.config를 통해 문제를 해결하는 것이 좋습니다. 앱이 다른 컴퓨터에서 호스팅되는 경우 발생하지 않을 것입니다.
답변
web.config 업데이트
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrl-Integrated-4.0" />
<add name="ExtensionlessUrl-Integrated-4.0"
path="*."
verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
호스트 구성을 수정할 필요가 없습니다.
답변
Asp.Net 웹 API에서-webconfig. 이것은 모든 브라우저에서 작동합니다.
System.web 태그 안에 다음 코드를 추가하십시오.
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
아래 코드로 system.webserver 태그를 바꾸십시오
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
<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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
답변
이것은 다른 답변과 함께 iis8에서 나를 위해 일했습니다. 내 오류는 구체적으로 404.6이었다
<system.webServer>
<security>
<requestFiltering>
<verbs applyToWebDAV="false">
<add verb="DELETE" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
답변
이 문제가 발생할 수있는 다른 사용자를위한 빠른 업데이트입니다. 오늘 현재 % userprofile % \ documents \ iisexpress \ config \ applicationhost.config를 변경해도 더 이상 작동하지 않습니다 (지금까지는 Windows 업데이트로 인한 것인지 확실하지 않습니다). 몇 시간 동안 좌절 한 후 web.config를 변경하여 작동하도록 system.webserver에 이러한 핸들러를 추가했습니다.
<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" />
</handlers>