[asp.net] ASP.NET 웹 API-PUT 및 DELETE 동사 허용되지 않음-IIS 8

최근에 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>

http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

호스트 구성을 수정할 필요가 없습니다.


답변

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>