Programing

IIS 7.5 + RESTFul 서비스에 대해 PUT 및 DELETE 사용, 확장 없음

crosscheck 2021. 1. 5. 08:29
반응형

IIS 7.5 + RESTFul 서비스에 대해 PUT 및 DELETE 사용, 확장 없음


IIS 7.5가 POST 및 PUT 요청을 처리하는 방법을 이해하려고합니다.

OpenRasta 프레임 워크를 사용하여 RESTful 서비스를 작성하고 있습니다. POST 작업은 문제없이 작동하지만 동일한 URL에 대한 PUT 작업은 작동하지 않습니다. 다음과 같은 오류를 반환합니다.

Detailed Error Information
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002

URL은 "http : //localhost/MyService/Resource.Something.manifest"와 같습니다.

동일한 설정은 Visual Studio 개발 IIS에서 잘 작동합니다.

해결책

기본적으로 기본 ExtensionlessUrlHandler는 PUT 및 DELETE 동사를 허용하지 않습니다. 추가하기 만하면됩니다.

<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />

PHP 5.4 고속 CGI 기반 REST API에 대해 IIS 7.5에서 PUT 및 DELETE를 허용하려면 WebDAV 모듈을 비활성화해야했습니다. 그렇지 않으면 WebDAV 모듈이 PUT 또는 DELETE를 사용하여 HTTP 요청에 개입합니다. 그러나이 작업을 수행하는 것은 약간 혼란스럽고 몇 단계를 놓쳤거나 다른 순서로 수행했을 수 있습니다.

이 줄은 응용 프로그램 루트의 web.config 에있는 <system.webServer>-element의 자식으로 배치됩니다 .

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
    <remove name="WebDAV" />
</handlers>

이것이 약간의 좌절감을 줄 수 있기를 바랍니다. 서버의 기본 설정은 나열되지 않은 HTTP 동사를 허용하는 것 같습니다 Request filtering -> HTTP Verbs -> Edit feature Settings. 아래의 설정을 참조하십시오 . 허용되는 동사를 명시 적으로 추가하는 것을 고려할 수 있습니다. 허용되는 동사는이 스 니펫을 추가하여의 하위로 지정할 수 있습니다 <system.webServer>.

    <security>
        <requestFiltering>
            <verbs allowUnlisted="false">
                <add verb="GET" allowed="true" />
                <add verb="POST" allowed="true" />
                <add verb="DELETE" allowed="true" />
                <add verb="PUT" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>

클라이언트 컴퓨터에서 다음 위치에서 WebDAV 모듈을 제거 할 수 있습니다.

Control Panel -> Uninstall Program -> Turn Windows features on or off -> IIS -> World Wide Web Services -> Common HTTP feautre -> WebDAV Publishing

작동시키기위한 마지막 방법 applicationhost.configC:\Windows\System32\inetsrv\config. 내부에 <system.webServer> -> <handlers>다음과 verb="GET,HEAD,POST같이 필요한 동사를 추가하기 위해 수정 한 PHP 항목이 표시됩니다 .

<add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,PUT,DELETE,POST"/>
                                                                 |
                                                                 |
                                                                 |
append verbs here  ----------------------------------------------|

1. IIS 관리자로 이동합니다.
2. 앱을 클릭합니다.
3. "Handler Mappings"로 이동합니다.
4. 기능 목록에서 "WebDAV"를 두 번 클릭합니다.
5. "Request Restrictions"를 클릭합니다.
6. "동사"탭에서 "모든 동사"를 선택합니다.
7. OK를 누릅니다.


OR 위키에서 링크 된 http://learn.iis.net/page.aspx/901/iis-express-faq/참조 하십시오 .

링크에서 (가독성을 위해 인용 부호가 아님) :

A : 폴더 applicationHost.config에서 IIS Express 수정할 수 있습니다 %userprofile%\documents\IISExpress\config. 예를 들어 확장없는 URL에 대해 PUT 및 DELETE를 사용하려면 IIS Express applicationHost.config파일 의 맨 아래로 스크롤 하여 다음으로 시작하는 처리기 항목을 찾습니다.

<add name="ExtensionlessUrl-Integrated-4.0"

에서 verb속성 추가 PUTDELETE소위 verb같은 속성 같습니다 verb="GET,HEAD,POST,DEBUG,PUT,DELETE".


내 시나리오는 IIS 7.5의 웹 사이트에있는 웹 응용 프로그램이었습니다. 웹 사이트는 WebDAV를 계속 활성화해야했지만 웹 애플리케이션은 REST API에서 PUT 및 DELETE를 지원하기 위해이를 꺼야했습니다.

작동하려면 웹 애플리케이션의 Web.config에 다음이 필요합니다.

<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true" >
  <remove name="WebDAVModule" />
</modules>

<handlers>
  <remove name="WebDAV" />
</handlers>

여기에있는 다른 답변과의 중요한 차이점은 runManagedModulesForWebDavRequests = "true"가 필요하다는 것입니다.


나를 위해 이것은 web.config에서 트릭을 수행합니다.

<system.webserver>
    <handlers>
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />

          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
<system.webserver/>

<system.web>
  <authentication mode="Windows" />
  <identity impersonate="true"/>
<system.web/>

다음 구성을 사용했습니다.

  • IIS 7.5
  • 윈도우 서버 2008 R2
  • 사용자 지정 응용 프로그램 풀, .NET 4.0, 통합
  • Windows 인증 = true
  • 익명 인증 = false

도움이 되었기를 바랍니다. ;-)


URLScan 도구 사용자

다른 답변이 여전히 작동하지 않고 404 오류가 발생 하면 URLScan 도구가 설치되어있는 경우 이러한 동사가 명시 적으로 거부 될 수 있습니다 .

요구 사항을 충족 하도록 파일 [AllowVerbs][DenyVerbs]섹션을 구성 할 수 있습니다 URLScan.ini.

이러한 동사를 사용 하면 보안 위험주의하십시오 .


나를 위해 일한 것은 WebDav를 완전히 제거하는 것입니다.


핸들러 매핑으로 이동하고 모든 동사를 처리하도록 WebDAV를 설정하는 것은 PUTDELETE이미 처리 된 동사로 나열 되었음에도 불구하고 저에게 효과적이었습니다. 내가 가지고있는 작업 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" />
      <remove name="WebDAV" />
      <add name="WebDAV" path="*" verb="*" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
    </handlers>
  </system.webServer>

in the web.config

<system.webServer>
    <handlers>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

you can also use the IIS management UI and define this globally, or default web server


I tried in IIS 8.

  • **uninstall WebDav Publishing

    Steps to uninstall -> Control Panel -> Go to Programs and features -> Turn windows featues on or off-> Select Internet Information Services->World Wide Web Services->Common HTTP Featues->"Remove" WebDAV Publishing by unchecking WebDAV option**


Reason for 500 error !

Hi all,

I want to post my own research too, I hope it would help future enthusiasts. As suggested in answers, I can't uninstall WebDav so I have added the line below in web config (from other answers)

 <system.webServer>
    <handlers>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

but I got a 500 error, when I have enabled debug mode found this

 Cannot add duplicate collection entry of type 'add' with unique key attribute 'name' set to 'ExtensionlessUrlHandler-Integrated-4.0'

Answer

Its because there was already an ExtensionlessUrlHandler in the handler mappings section, do the following to resolve the issue.

Method 1

1) Go to Your IIS Manager and select your app

2) Go to Handler Mappings feature

3) Find ExtensionlessUrlHandler-Integrated-4.0 and delete it.

4) Add ExtensionlessUrlHandler in your webconfig (as mentioned in above answers)

<system.webServer>
<handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

Method 2

1) Remove ExtensionlessUrl handler from your web config

2) Click on your app in IIS Server, go to HandlerMappings

3) Find ExtensionlessUrlHandler-Integrated-4.0 (only this name, ignore others)

4) right click on it and choose Edit

edit handler

5) click on 'Request Restrictions' and select Verbs tab & choose All Verbs

this will enable extensionsless handler to allow all verbs.

I will go with method 1, as we can have control in web.config. But make sure you check the deployment server for duplicate handler definitions.


My web.config with asp.net core 1.0

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <modules>
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
  </system.webServer>
</configuration>

In windows server 2012. Open applicationHost.config file in notepad with Administrator rights

applicationHost.config file is found in C:\Windows\System32\inetsrv\config

Locate the section

 <verbs allowUnlisted="false" applyToWebDAV="true">
   <add verb="GET" allowed="true" />
   <add verb="HEAD" allowed="true" />
   <add verb="POST" allowed="true" />
   <add verb="DELETE" allowed="false" />
   <add verb="TRACE" allowed="false" />
   <add verb="PUT" allowed="false" />
   <add verb="OPTIONS" allowed="false" />
</verbs>

Notice DELETE and PUT HTTP Verbs are set to false. Change them to true.

It should now read as below

 <verbs allowUnlisted="false" applyToWebDAV="true">
   <add verb="GET" allowed="true" />
   <add verb="HEAD" allowed="true" />
   <add verb="POST" allowed="true" />
   <add verb="DELETE" allowed="true" />
   <add verb="TRACE" allowed="false" />
   <add verb="PUT" allowed="true" />
   <add verb="OPTIONS" allowed="false" />
</verbs>

Save the file. You have enabled HttpPut and HttpDelete requests on your web server

ReferenceURL : https://stackoverflow.com/questions/6739124/iis-7-5-enable-put-and-delete-for-restful-service-extensionless

반응형