ASP.NET MVC3アプリケーションでHTTP PUT
とDELETE
を使用しています。ローカルで実行すると、すべてが正常に機能します。しかし、アプリケーションをサーバーに公開すると、これらのメソッドは機能しません。
WebサーバーがPUT
およびDELETE
要求をサポートできるようにするための特別な設定はありますか? IIS 7.5。で共有ホスティングを使用しています。
更新:
IIS manager
でPUT
およびDELETE
リクエストを有効にします。 PUT
コマンドは正常に機能します。しかし、DELETE
はまだ機能しません。 jQuery
でリクエストを作成します:
私はこのページにいます:
http://domain.com/dashboard/edit-site/103323/links/
私のajaxコールは次のとおりです:
$.ajax({
// url: same as page-url,
cache: false,
type: 'DELETE',
data: { linkid: $(link).data("linkid") },
beforeSend: function () {
// doing something in UI
},
complete: function () {
// doing something in UI
},
success: function (data) {
// doing something in UI
},
error: function () {
// doing something in UI
}
});
これにより、次のようなリクエストが作成されます。
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://domain.com
Referer: http://domain.com/dashboard/edit-site/103323/links/
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
X-Requested-With: XMLHttpRequest
これでForm Data
:
linkid:104044
IIS ManagerでHandler Mappingsに移動します。見つける ExtensionlessUrlHandler-Integrated-4.0
、ダブルクリックします。 Request Restrictions ...ボタンをクリックし、VerbsタブでDELETE
とPUT
の両方を追加します。
編集:WebDav Publisherの問題の可能性
2008年のサーバーで実行していた削除済みの投稿に言及しましたか? webDavロールを削除するか、サイトから無効にしますconfig
:on system.webServer
-> modules
セクション、WebDAVModule
モジュールの削除:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
PUT
またはDELETE
のasp.net Web APIの運用環境で次のエラーが発生する場合、これらのメソッドはローカルで正常に機能しています。
405-このページへのアクセスに使用されるhttp動詞は許可されていません。
サーバーのweb.configに次の設定を追加するだけです
<system.webServer>
<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>
<modules>
<remove name="WebDAVModule" />
</modules>
</system.webServer>
原因: webDAV モジュールはデフォルトでPUT/DELETEメソッドをブロックします。したがって、最初にこのモジュールとそのハンドラーを削除してください。最初に、既存のExtensionlessUrlHandler-Integrated-4.0設定を削除し、目的のpath
およびverbs
とともに追加します。
次のコード行をweb.configに追加するだけです。
<system.webServer>
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
そして
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
最後に、私は答えが不安定であることを見つけました。以下のjQuery呼び出しをthoに変更しましたが、今はうまく機能しています。
$.ajax({
url: this.href + "?linkid=" + $(link).data("linkid"),
cache: false,
type: 'DELETE',
// data: { linkid: $(link).data("linkid") },
beforeSend: function () {
// doing something in UI
},
complete: function () {
// doing something in UI
},
success: function (data) {
// doing something in UI
},
error: function () {
// doing something in UI
}
});
DELETE
呼び出しが、Form Data
?ローカルにいる間、それはうまく機能しましたか?