ASP.NET Web APIを使用してRESTサービスを作成しました。 HttpDeleteリクエストを送信しようとしていますが、次のエラーが表示されます。
405-このページへのアクセスに使用されるHTTP動詞は許可されていません
私は解決策に近づいていると思う、IISリモート管理を有効にし、ハンドラーマッピングセクションに移動し、DELETE動詞を適切な位置に追加する必要があることがわかりました...しかし、問題はリスト上の多くの異なる位置...(sthのようなもの: http://www.somacon.com/p126.php )。
どちらを編集する必要がありますか?拡張機能がないものはほとんどありません。 「ExtensionUrlHandler-Integrated-4.0」とDELETE動詞を追加しましたが、まだ機能しません...
それを変更するのは暗闇の中でのショットでしたので、別の位置を変更する必要がありますか?もしそうなら、どれ?それとも、私がすべきことはまだありますか?
同じWebサービスがローカルサービスで完全に機能するため、問題はリモートIISにあると思います...
あいさつ
このエラーの一般的な原因は WebDAV です。必ずアンインストールしてください。
WebDAVをアンインストールする必要はありません。web.configに次の行を追加するだけです。
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
以下のように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>
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>
上記の解決策のいずれも私の場合のように問題を解決しない場合(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)を返します
珍しいが、いくつかを助けるかもしれません。
[HttpPut] from System.Web.Httpを使用していることを確認してください
HttpPutで装飾されたメソッドで「許可されていないメソッド」405を取得していました。
System.Web.HttpではなくSystem.Web.Mvcの[HttpPut]属性を誤って使用したため、この問題は珍しいようです。
その理由は、resharperが.Mvcバージョンを提案したことです。通常、ApiControllerから直接派生するときにSystem.Web.Httpが既に参照されているため、ApiControllerを拡張したクラスを使用していました。
このエラーは、静的ファイルハンドラから発生します。デフォルトでは、動詞はフィルタリングされませんが、おそらく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であるアプリケーション(またはアプリケーションディレクトリ)バージョンのローカルです。
呼び出していた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)
IIS 8.0の場合、HTTPアクティベーションが有効になっているかどうかを確認します。サーバーマネージャー-> IIS->管理(右上を参照)->役割と機能の追加-> ...-> WCF構成に移動し、HTTP Activationを選択します。
PHP
(場合によってはLaravel
)または405 error
を使用する他の固有のIIS
ホスティング状況を実行しようとして動けなくなる人のために、 verbs
はその特定の状況のハンドラーで... PHP
を使用していたので、PHP
ハンドラーに移動し、Request Restrictions
でVerbs
タブで、必要なverbs
を追加します。 CORS
でLaravel
を有効にするために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>
上記のすべてのソリューションに加えて、「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
それが役に立てば幸い。
私たちの場合、問題は.NetサイトとADFS間のフェデレーションサインオンにありました。 ADFSエンドポイントにリダイレクトする場合、wctx
パラメーターには、WSFederationAuthenticationModule.CreateSignInRequest
メソッドの3つのパラメーターすべてが必要でした:rm
、id
、およびru
URLパラメーターをチェックするためのヒントをくれたGuillaume Raymondに感謝します!