1. ホーム
  2. asp.net

[解決済み] ASP.NET Web API - PUT & DELETE 動詞が許可されない - IIS 8

2022-04-27 21:29:14

質問内容

先日、Visual Studio 2010からVisual Studio 2012 RCにアップグレードしました。インストーラーにはIIS 8 Expressもインストールされており、Visual StudioはこれをデフォルトのWebサーバーとして使用します。

IIS 8は、PUTおよびDELETE動詞を使用する私のウェブAPIリクエストをブロックしています。IIS は 405 エラーを返します。 The requested resource does not support http method 'PUT' .

過去にこの問題で困っている人がいることは知っていますし、Stack Overflowにもこの件に関するメッセージがいくつかあります。IIS 7 Expressでは、解決策はWebDavをアンインストールすることでした。残念ながらIIS 8でそれを行う方法は見当たりません。

applicationhost.configからWebDavのセクションを編集してみましたが、解決に至りませんでした。例えば、私は <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> を設定ファイルから削除してください。

あまりにも長い時間を費やしてしまいました。PUTとDELETEを有効にする簡単な方法があるはずです?

どのように解決するのですか?

さて、やっとこさ真相にたどり着きました。IIS8でPUTとDELETE動詞を正しく動作させるには、いくつかの輪を飛び越える必要があります。実際、VS 2012のリリース候補をインストールして新しいWEB APIプロジェクトを作成すると、サンプルのPUTとDELETEメソッドはすぐに404エラーを返すことがわかります。

Web APIでPUTとDELETEの動詞を使用するには、%userprofile%documentsのThinkpadを編集し、以下のようにExtensionlessUrlハンドラに動詞を追加する必要があります。

この行を変更してください。

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

になります。

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

上記に加えて、WebDAV がリクエストに干渉しないようにする必要があります。これは applicationhost.config から次の行をコメントアウトすることで実現できます。

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

また、Web API のデフォルトの規約では、メソッド名は呼び出される HTTP 動詞と同じであるべきとされていることに注意してください。例えば、HTTPの削除リクエストを送信する場合、デフォルトではメソッド名をDeleteとする必要があります。