Подтвердить что ты не робот

Как включить 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
4b9b3361

Ответ 1

Перейдите в Отображения обработчика в диспетчере IIS. Найдите ExtensionlessUrlHandler-Integrated-4.0, дважды щелкните его. Нажмите кнопку Запросить ограничения... и на вкладке "Глаголы" добавьте как DELETE, так и PUT. enter image description here


РЕДАКТИРОВАТЬ: Возможная проблема с издателем WebDav

Вы упомянули о удаленной почте, которую вы запускали на сервере 2008 года? Попробуйте удалить роль webDav или отключите его со своего сайта config: в разделе system.webServermodules, удалите 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? В то время как на местном он был и работал нормально?