web-dev-qa-db-ja.com

ASP.NET Web APIは、一部のサーバーでのみPUTに対して404を返します

ASP.NET MVC Web APIを使用するサイトを作成しましたが、ステージングサーバーに配置するまですべてが正常に機能しています。このサイトは、ローカルマシンとdev Webサーバーで正常に動作します。開発サーバーとステージングサーバーはどちらもWindows Server 2008 R2です。

問題はこれです。基本的にサイトは機能しますが、HTTP PUTメソッドを使用するAPI呼び出しがいくつかあります。これらは404を返すステージングでは失敗しますが、他の場所では正常に機能します。

私が出会って修正した最初の問題は、リクエストのフィルタリングにありました。しかし、まだ404を取得しています。

IISでトレースをオンにすると、次の問題が発生します。

168. -MODULE_SET_RESPONSE_ERROR_STATUS 
ModuleName IIS Web Core 
Notification 16 
HttpStatus 404 
HttpReason Not Found 
HttpSubStatus 0 
ErrorCode 2147942402 
ConfigExceptionInfo  
Notification MAP_REQUEST_HANDLER 
ErrorCode The system cannot find the file specified. (0x80070002) 

構成は開発とステージングで同じです。実際、サイト全体が直接コピーです。

GETとPOSTは機能するが、PUTは機能しないのはなぜですか?

30
Greg Bacchus

それらのIISサーバーにはweb-davモジュールがインストールされていますが、インストールする人がすべてのボックスにチェックマークを付けたため、これは不要でありインストールされたに違いありません。

Iisからweb-davを削除するだけです。

または、web.configを使用してweb davモジュールを削除します。

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    ...
26
Aliostad

WebDAVが有効になっていないが、MVC 4のWeb APIを使用してこの問題がまだ発生している場合...

スティーブ・ミケロッティは私のために働いた解決策を文書化した ここ

一日の終わりに、Web構成でExtensionlessUrlHandler-Integrated-4.0ハンドラーに対してすべての動詞(verb = "*")を有効にしました。

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
        <handlers>
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
</system.webServer>
47
Kevin Ortman

これにはいくつかの理由が考えられます。上記のどれも私にとってはうまくいきませんでした。 web.configにExtensionlessUrlHandler設定があり、必要なすべてのHTTP動詞が含まれています。最終的に、IISで次の変更を行う必要がありました。

  • IIS Webサイトを選択し、Handler Mappingsをダブルクリックします
  • ExtensionlessUrlHandler-ISAPI-4.0_32bitを見つけてダブルクリックします
  • 表示されるダイアログで、[Request Restrictions]をクリックします
  • [動詞]タブで、欠落しているHTTP動詞をコンマで区切って追加します(私の場合はPUTDELETEでした)
  • 必要に応じてOkをクリックし、ポップアップするEdit Script MapダイアログでYesと答えます。
  • ExtensionlessUrlHandler-ISAPI-4.0_64bitについて繰り返します

これが誰かを助けることを願っています:)

12
wingyip

ホスティングプロバイダーはWebDAVをアンインストールできませんでした。これはすべてのユーザーに影響するためです。

これ、runAllManagedModulesForAllRequests = "true"は機能しましたが、推奨されませんでした。

多くの修正には、WebDAVModuleのモジュールの削除が含まれていましたが、それでも動作しませんでした。ハンドラーも削除し、最後にすべての動詞POST GET PUT DELETE。

モジュールとハンドラーでWebDAVModuleとWebDAVを削除します。

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

UrlScan ISAPIフィルターを削除してこれを修正しました

4
pomber

私の場合、これらのソリューションはいずれも適用されませんでした。

アプリプールをClassicではなくIntegratedに変更して修正しました。

ハンドラー:

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

preConditionintegratedModeであるため、Classicアプリプールでは動作しません。

4
toddmo

West-WindのRick Strahlは次のことを推奨しました。

 <ハンドラー> 
 <remove name = "ExtensionlessUrlHandler-Integrated-4.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>
 
1
RickIsWright

こんにちは私にとっては、解決策はありませんでした。私は最終的にこれをやって働いた:

1)IISアプリケーションを選択してください。
2)要求フィルタリングに移動
3)次に、[HTTP Verbs]タブを選択します
4)PUTおよびその他の動詞がfalseを許可していることがわかりましたが、編集することができなかったため、動詞を削除してから、右側のペインで[動詞を許可]を選択するか、リストを右クリックしてそれを選択します。問題を抱えている動詞を入力してください!

これが誰かを助けることを願っています!

1
user2736265

以前にクラシックモードであったWebサイトのアプリケーションプールを統合モードに変更することで、これを解決しました。

0
James Hay