Как включить HTTP PUT и DELETE для ASP.NET MVC в IIS?
Я использую HTTP PUT
и DELETE
в моем приложении ASP.NET MVC3. Когда я запускаю его на местном уровне, все работает правильно; Но когда я публикую приложение на сервере, эти методы не работают.
Существуют ли какие-либо специальные настройки, позволяющие веб-серверу поддерживать запросы PUT
и DELETE
? Я использую общий хостинг с IIS 7.5.
UPDATE:
Я включаю PUT
и DELETE
запросы в IIS manager
. 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
Ответы
Ответ 1
Перейдите в Отображения обработчика в диспетчере IIS. Найдите ExtensionlessUrlHandler-Integrated-4.0
, дважды щелкните его. Нажмите кнопку Запросить ограничения... и на вкладке "Глаголы" добавьте как DELETE
, так и PUT
.
![enter image description here]()
РЕДАКТИРОВАТЬ: Возможная проблема с издателем WebDav
Вы упомянули о удаленной почте, которую вы запускали на сервере 2008 года? Попробуйте удалить роль webDav или отключите его со своего сайта config
: в разделе system.webServer
→ modules
, удалите WebDAVModule
module:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
Ответ 2
Если вы получаете следующую ошибку в вашей производственной среде в веб-интерфейсе asp.net на PUT
или DELETE
хотя эти методы работают локально.
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
.
Ответ 3
Вам просто нужно добавить следующие строки кода в свой 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>
Ответ 4
Наконец я нахожу ответ случайным. Я изменил вызов 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
? В то время как на местном он был и работал нормально?