Asp.NET Web API-405-このページへのアクセスに使用されるHTTP動詞は許可されていません-ハンドラーマッピングを設定する方法


106

ASP.NET Web APIを使用してRESTサービスを作成しました。HttpDeleteリクエストを送信しようとしていますが、次のエラーが発生します。

405-このページへのアクセスに使用されるHTTP動詞は許可されていません

私はソリューションに近いと思います。IISリモート管理を有効にし、ハンドラーマッピングセクションに移動して、DELETE動詞を適切な位置に追加する必要があることがわかりましたが、問題は、リスト...(このように:http : //www.somacon.com/p126.php)。

どれを編集する必要がありますか?「ExtensionUrlHandler-Integrated-4.0」など、拡張子のないものはほとんどなく、それにDELETE動詞を追加しましたが、それでも機能しません...

暗闇の中でそれを修正するためのショットだったので、別の位置を修正する必要がありますか?もしそうなら、どれですか?それとも私がすべきことは他にありますか?

同じWebサービスがローカルサービスで完全に正常に動作するため、問題はリモートIISにあると思います...

ご挨拶


3
おい、バート。web.configの答えを変更できますか?それをアンインストールするよりも本当に良いです。たくさんの視聴者がいます
アシュカンシラス

回答:


28

このエラーの一般的な原因はWebDAVです。必ずアンインストールしてください。


無効にしましたが、役に立ちませんでした
Bart

3
無効にしても効果はありません。アンインストールする必要があります。
John_

無効にしても効果がないことを確認できました。@John_には正しいので、アンインストールする必要があります。
マイクL

7
以下のgiacomelliの回答は、この質問に対して正しいものとしてマークする必要があります。これは、WebDavをアンインストールする必要のないローカルソリューションです。
ジョセフウッドワード

1
@ B.ClayShannon WebDAVはスタンドアロンプ​​ログラムではなく、IISの機能です。そのため、OSによっては、Windowsの機能/ロール/ロールサービス/ ...の下で、分類のために発明するのに適していると思われるものを見つける必要があります。しかし、web.configの変更によって相違が生じなかった場合は、とにかく別の問題が発生することを意味します。
フレデリック

359

WebDAVをアンインストールする必要はありません。次の行をweb.configに追加するだけです。

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

1
これはうまくいきました。すべてを使用する必要があります。両方の「remove name = ...」行を含めます。
Chris Patterson

51
これは、グローバルなソリューションではなくローカルなソリューションであるため、受け入れられた答えであるはずです。
Marco Mp 2013

3
これは、明日の朝の大きなデモの前に私に思いついたばかりです。あなたは文字通り私の命を救った。
Sonic Soul

27
「あなたは文字通り私の命を救った」-突然、私のクライアントはそれほど悪くないようです。
Brandon Gano 14

3
すばらしい答えです。これが受け入れられる答えであることに同意します。これにより、WebサーバーからWebDAVを完全にアンインストールするよりもずっと気分が良くなりました。
mituw16

17

以下のようにWeb.Configファイルを変更します

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

削除WebDAVおよびWebDAVMODULEを追加すると、PUTおよびDELETE関数が許可されました。ありがとう。
Gfw、

上記のコードをapiプロジェクトのwebconfigファイルに追加すると、問題が発生しました
Baqer Naqvi

15

以下のように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>

Allow-Originには*を返さないでください。stackoverflow.com/a/12014554を
Karlas

@カーラス、コメントを入れて投票する前に、まず質問を読んでください。「Allow-Origin」ではなく、http動詞のハンドラーが要求されました。
Santosh Prasad Sah 2017

3
誰かがコピーを貼り付けてソリューションを貼り付けた場合に備えて、私は反対票を投じなかった。
Karlas、2017

ありがとう!runAllManagedModulesForAllRequests = "true"が私にとって何をしたかです。
エディフレッチャー

9

私はこの問題を抱えていて、以下を解決しました:

  1. IISを開く
  2. バックエンドサイトを選択

    ここに画像の説明を入力してください

  3. 機能ビュー:ハンドラーマッピングを開く

ここに画像の説明を入力してください

  1. (ハンドラーマッピング)ウィンドウで、WebDAVを検索します

ここに画像の説明を入力してください

  1. モジュールマッピングの編集で、リクエストの制限を開きます

ここに画像の説明を入力してください

  1. ここに画像の説明を入力してください

私を助けた。ありがとう
deanwilliammills

1
これは機能しませんでした。.NET COREサイト全体を破壊しました。元に戻す必要がありました。
Ravi Ram、

4

上記の解決策のいずれも私の問題のように問題を解決しない場合(まだRestClientモジュールが405に直面している状態のままです)、PostmanやFiddlerなどのツールでAPIをリクエストしてみてください。問題は、フォーマットが正しくないリクエストのような他の場所にある可能性があることを意味します。

私のRestClientモジュールがIdパラメータが正しくフォーマットされていない 'Put'を要求していることがわかりました:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

の代わりに

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

誤ってフォーマットが正しくないリクエストが405-メソッドが許可されていません(IIS 7.5)


私も同じ状況です。しかし、私の場合、PUTリクエストでボディを渡す必要があります。私はInsomnia(Postmanのような)をツールクライアントとして使用していますが、非常にうまく機能します。しかし、私のコードではありません。何か案は?
ダロス

3

一般的ではありませんが、いくつかを助けるかもしれません。

あなたが使用していることを確認し、[HttpPut]からSystem.Web.Http

HttpPut修飾されたメソッドで「許可されていないメソッド」405を取得していました。

System.Web.HttpではなくSystem.Web.Mvcの[HttpPut]属性を誤って使用したため、問題はまれであるように見えます。

その理由は、resharperが.Mvcバージョンを提案したためです。通常、ApiControllerから直接派生した場合、System.Web.Httpはすでに参照されており、ApiControllerを拡張したクラスを使用していました。


1
Web APIを使用している場合は、コントローラーメソッドをまったく装飾しません。ただし、メソッド名に動詞を使用します。
niico

2

本文でアクセスした複雑な型ではなく、呼び出したWeb APIのpostメソッドがパラメーターのプリミティブ型を持っていると、これが発生しました(405メソッドは許可されていません)。そのようです:

これはうまくいきました:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

これはしませんでした:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

1
これは、ルートのパラメーターとメソッドシグネチャの変数名に不一致がある場合にも発生する可能性があります(つまり、route = "/ api / person / {identity}"とmethod = "public void putPerson(int id) {...} ")
RonnBlack

2

このエラーはstaticfileハンドラーから発生します-デフォルトでは動詞をフィルターしませんが、おそらくHEADとGETしか処理できません。

そして、これは、他のハンドラーがプレートにステップアップせず、DELETEを処理できると述べたためです。

WEBAPIを使用しているため、ルーティングのためにファイルがなく、したがって拡張子もないため、web.configファイルに次の追加を追加する必要があります。

<system.webserver>
    <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="C:\windows\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="C:\windows\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" />

明らかに何が必要かは、クラシックモードと統合モードに依存し、クラシックモードはビット数に依存します。さらに、OPTIONSヘッダーがCORS処理用に追加されていますが、CORSを行わない場合は必要ありません。

ちなみに、あなたのweb.configは、トップレベルがapplicationHost.configであるアプリケーション(またはアプリケーションディレクトリ)バージョンのローカルです。


1

IIS 8.0の場合は、HTTPアクティベーションが有効になっているかどうかを確認します。サーバーマネージャー-> IIS->管理(右上を参照)->役割と機能の追加-> ...-> WCF構成に移動し、[HTTPアクティブ化]を選択します。


0

私たちの場合、問題は.NetサイトとADFS間のフェデレーションサインオンに関するものでした。ADFSにリダイレクトするときにエンドポイントwctxのパラメータはすべてのために3つのパラメータを必要と WSFederationAuthenticationModule.CreateSignInRequestする方法:rmid、およびru

URLパラメータをチェックするヒントを提供してくれたGuillaume Raymondに感謝します。


0

上記のすべてのソリューションに加えidて、DELETEメソッドに「」またはカスタム定義のパラメーターがルート構成と一致しているかどうかを確認してください。

public void Delete(int id)
{
    //some code here
}

405エラーが繰り返し発生した場合は、メソッドシグネチャを上記のようにデフォルトにリセットし、再試行してください。

デフォルトでは、ルート構成idはURLで検索します。したがって、フォルダーのid下のルート構成を変更しない限り、ここではパラメーター名が重要ですApp_Start

idただし、データ型を変更できます。

たとえば、以下のメソッドは問題なく機能するはずです。

public void Delete(string id)
{
    //some code here
}

注:また、ペイロードを本文コンテンツとして運ぶデータメソッドではなく、URLを介してデータを渡すようにしてください。

DELETE http://{url}/{action}/{id}

例:

DELETE http://localhost/item/1

それが役に立てば幸い。


0

私が実行しようとして動けなくなるもののために追加されますPHPLaravel5月場合)、または他のユニークなIISとホスティングの状況405 errorを変更する必要があることを、verbs私が使っていたので、以来...その特定の状況のため、そのためのハンドラでPHP、私はに行ってきましたPHPハンドラとではRequest Restrictions、そのVerbsタブは、追加verbsの必要を。これをに追加して、web.configで有効CORSにするだけLaravelでした。

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>

0

上記のいずれもうまくいかず、サポートページ(https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website)を使用してトラブルシューティングを行いましたサーバーでホストされている場合、アプリケーションホストファイルを作業コピーの1つと比較し、ハンドラーの束が不足しているように見え、それらをアプリケーションホストに追加して戻したところ、機能し始めました。私はこれらすべてを逃していた、

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.