web-dev-qa-db-ja.com

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

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

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

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

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

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

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

あいさつ

94
Bart

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

26
Darin Dimitrov

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

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

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

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

上記の解決策のいずれも私の場合のように問題を解決しない場合(405に直面しているRestClientモジュールがまだスタックしている)、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)を返します

4

珍しいが、いくつかを助けるかもしれません。

[HttpPut] from System.Web.Httpを使用していることを確認してください

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

System.Web.HttpではなくSystem.Web.Mvcの[HttpPut]属性を誤って使用したため、この問題は珍しいようです。

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

3
Nick Josevski

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

  1. iISを開く
  2. バックエンドサイトを選択します

    enter image description here

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

enter image description here

  1. [ハンドラーマッピング]ウィンドウで、[WebDAVを検索]

enter image description here

  1. [モジュールマッピングの編集]で、[要求の制限]を開きます

enter image description here

  1. enter image description here
3
BehrouzMoslem

このエラーは、静的ファイルハンドラから発生します。デフォルトでは、動詞はフィルタリングされませんが、おそらく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" />

neededとは明らかにclassicmode vs integratedmodeに依存し、classicmodeはbitnessに依存します。さらに、CORS処理用にOPTIONSヘッダーが追加されましたが、CORSを実行しない場合は必要ありません。

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

2
Gerard ONeill

呼び出していた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)
2
Tony Anderson

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

1
Narsi Venkat

PHP(場合によってはLaravel)または405 errorを使用する他の固有のIISホスティング状況を実行しようとして動けなくなる人のために、 verbsはその特定の状況のハンドラーで... PHPを使用していたので、PHPハンドラーに移動し、Request RestrictionsVerbsタブで、必要なverbsを追加します。 CORSLaravelを有効にするためにweb.configに追加する必要があるのはこれだけでした。

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

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

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

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

デフォルトのルート設定は、URLでidを探します。そのため、App_Startフォルダーの下のルート構成を変更しない限り、パラメーター名idは重要です。

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

たとえば、以下の方法はうまく機能するはずです。

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

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

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

例:

DELETE http://localhost/item/1

それが役に立てば幸い。

0
Arun

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

URLパラメーターをチェックするためのヒントをくれたGuillaume Raymondに感謝します!

0
dan fox