web-dev-qa-db-ja.com

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" />
55
Eatdoku

PUTとDELETEをIIS 7.5 for PHP 5.4 fast-CGI駆動REST APIそれ以外の場合、WebDAVモジュールはPUTまたはDELETEを使用してHTTPリクエストに介入しますが、これを実現するのは少し混乱し、いくつかの手順を逃したか、別の順序で実行した可能性があります。

これらの行は、アプリケーションルートのweb.config<system.webServer>-要素の子として配置されます。

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

これが少しのフラストレーションを免れることを願っています。サーバーのデフォルト設定は、リストされていないHTTP動詞を受け入れるようです-Request filtering -> HTTP Verbs -> Edit feature Settingsの下の設定を参照してください。許可されるVERBSを明示的に追加することを検討できます。許可される動詞は、<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.configにあるC:\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  ----------------------------------------------|
74
John P

1。IIS Managerに移動します。
2。アプリをクリックします。
3。「ハンドラーマッピング」に進みます。
4。機能リストで、「WebDAV」をダブルクリックします。
5。「リクエストの制限」をクリックします。
6。[動詞]タブで[すべての動詞]を選択します。
7。[OK]を押します。

29
Jalaa Zahwa

OR wikiからリンクされている http://learn.iis.net/page.aspx/901/iis-express-faq/ を参照してください。

リンクから(読みやすくするために引用符で囲まれていない):

A:IIS Express applicationHost.configは、%userprofile%\documents\IISExpress\configフォルダーで変更できます。たとえば、拡張機能のないURLに対してPUTとDELETEを有効にするには、IIS Express applicationHost.configファイルの一番下までスクロールし、次で始まるハンドラーエントリを探します。

<add name="ExtensionlessUrl-Integrated-4.0"

verb属性にPUTおよびDELETEを追加して、verb属性がverb="GET,HEAD,POST,DEBUG,PUT,DELETE"のようになるようにします。

11
SerialSeb

私のシナリオは、IIS 7.5のWebサイトにあるWebアプリケーションでした。WebサイトはWebDAVを引き続き有効にする必要がありましたが、WebアプリケーションはPUTおよびDELETEそのREST API。

それを機能させるために、WebアプリケーションのWeb.configには以下が必要でした:

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

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

ここの他の回答との重要な違いは、runManagedModulesForWebDavRequests = "true"の必要性です。

9
John Blenheim

私にとって、これは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
  • Windows Server 2008 R2
  • カスタムアプリケーションプール、.NET 4.0、統合
  • Windows認証= true
  • 匿名認証= false

それが役に立てば幸い。 ;-)

7
user2084570

URLScanツールのユーザー

それでも他の回答が機能せず、404エラーが表示される場合:これらの動詞はURLScanによって明示的に拒否される場合がありますツール(インストールされている場合)。

[AllowVerbs]ファイルの[DenyVerbs]およびURLScan.iniセクションを構成して、ニーズに合わせることができます。

セキュリティリスク これらの動詞を有効にすることに注意してください。

6
Alph.Dev

私のために働いたのは、WebDavを完全にアンインストールすることでした。

5
leojh

PUTDELETEが処理済みの動詞として既にリストされているという事実にもかかわらず、ハンドラーマッピングに入り、すべての動詞を処理するようにWebDAVを設定することだけがうまくいきました。私が持っている作業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>
4

IIS 8。

  • ** WebDav Publishingのアンインストール

    アンインストールの手順->コントロールパネル->プログラムと機能に移動->ウィンドウの機能をオンまたはオフにする->インターネットインフォメーションサービスの選択-> World Wide Webサービス->共通のHTTP機能->「削除」WebDAVのオプションをオフにしてWebDAV発行**

3
bgS

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>

IIS管理UIを使用して、これをグローバルに定義するか、デフォルトのWebサーバーにすることもできます

3
Sergio

500エラーの理由!

こんにちは、みんな、

私も自分の研究を投稿したい、それは将来の愛好家に役立つことを願っています。回答で示唆されているように、WebDavをアンインストールできないため、Web設定に以下の行を追加しました(他の回答から)

 <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>

しかし、デバッグモードを有効にしたときに500エラーが発生しました

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

回答

ハンドラーマッピングセクションにExtensionlessUrlHandlerが既にあったため、次の手順を実行して問題を解決します。

方法1

1)IIS Managerに移動し、アプリを選択します

2)ハンドラーマッピング機能に移動

3)ExtensionlessUrlHandler-Integrated-4.0を見つけて削除します。

4)webconfigにExtensionlessUrlHandlerを追加します(上記の回答で述べたように)

<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>

方法2

1)Web構成からExtensionlessUrlハンドラーを削除する

2)IISサーバー、HandlerMappingsにアクセスして、アプリをクリックします。

3)ExtensionlessUrlHandler-Integrated-4.0を見つけます(この名前のみ、他は無視します)

4)それを右クリックし、編集を選択します

ハンドラーの編集

5)[リクエストの制限]をクリックして[動詞]タブを選択し、[すべての動詞]を選択します。

これにより、エクステンションレスハンドラーがすべての動詞を許可できるようになります。

Web.configで制御できるため、方法1に進みます。ただし、展開サーバーでハンドラー定義の重複を確認してください。

2
Ganesh Vellanki

Windows Server 2012で。 applicationHost.config管理者権限でメモ帳のファイルを開く

applicationHost.configファイルはC:\ Windows\System32\inetsrv\configにあります

セクションを見つけます

 <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>

DELETEおよびPUT HTTP動詞がfalseに設定されていることに注意してください。それらをtrueに変更します。

次のようになります

 <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>

ファイルを保存します。 WebサーバーでHttpPutおよびHttpDeleteリクエストを有効にしました

1
rhalf

Asp.netコア1.0を使用したweb.config

<?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>
1
Heli Perez