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

ASP.NET Web API возвращает 404 для PUT только на некоторых серверах

Я написал сайт, который использует ASP.NET MVC Web API, и все работает хорошо, пока я не поместил его на промежуточный сервер. Сайт отлично работает на моей локальной машине и на веб-сервере разработчика. Как серверы разработки, так и промежуточные серверы являются Windows Server 2008 R2.

Проблема заключается в следующем: в основном сайт работает, но есть некоторые вызовы API, которые используют метод HTTP PUT. Они терпят неудачу при постановке, возвращая 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?

4b9b3361

Ответ 1

На этих серверах IIS установлен модуль веб-dav, и я уверен, что он не нужен, и он был установлен, потому что человек установил все галочки.

Просто удалите web-dav из iis.

В качестве альтернативы используйте web.config для удаления веб-модуля dav:

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

Ответ 2

Для тех из вас, кто не поддерживает WebDAV, но все еще работает в этой проблеме с использованием веб-API MVC 4...

Стив Микелотти задокументировал решение, которое сработало для меня здесь.

В конце дня я включил все глаголы (verb = "*" ) в обработчик ExtensionlessUrlHandler-Integrated-4.0 в моей веб-конфигурации.

<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>

Ответ 3

Кажется, есть ряд причин, по которым это происходит. Ни один из вышеперечисленных не работал у меня. У меня уже были настройки ExtensionlessUrlHandler в web.config со всеми необходимыми HTTP-глаголами. В итоге мне пришлось внести следующие изменения в IIS:

  • В IIS выберите свой сайт и дважды щелкните Handler Mappings
  • Найдите ExtensionlessUrlHandler-ISAPI-4.0_32bit и дважды щелкните
  • В появившемся диалоговом окне нажмите Request Restrictions
  • На вкладке "Глаголы" добавьте отсутствующие HTTP-глаголы, разделенные запятыми (в моем случае это были PUT и DELETE
  • Нажмите Ok, где требуется, и ответьте Yes в появившемся диалоговом окне Edit Script Map.
  • Повторите для ExtensionlessUrlHandler-ISAPI-4.0_64bit

Надеюсь, это поможет кому-то:)

Ответ 4

Мой хостинг-провайдер не смог удалить WebDAV, так как это повлияло бы на всех.

Это, runAllManagedModulesForAllRequests = "true", работает, но не рекомендуется.

Многие исправления включали удаление модуля для WebDAVModule, но это все еще не сработало. Я также удалил обработчик, и, наконец, я мог использовать все глаголы POST GET PUT DELETE.

Удалите WebDAVModule и WebDAV в модулях и обработчиках.

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

Ответ 5

Я исправил это, удалив фильтр UrlScan ISAPI

Ответ 6

В моем случае ни одно из этих решений не применялось.

Я исправил его, изменив свой пул приложений на Интегрированный, а не на классический.

Обработчик:

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

не будет работать с классическим пулом приложений, так как его preCondition - integratedMode.

Ответ 7

Рик Страл из West-Wind рекомендовал следующее:   

    < handlers>
    < 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>
    
Который хорошо работал у меня.

Ответ 8

Я решил это, изменив свой пул приложений для веб-сайта в интегрированном режиме, когда он был ранее в классическом режиме.

Ответ 9

Привет Для меня ни одно из решений не сработало. Я наконец получил это, работая следующим образом:

1) В IIS выберите ваше приложение.
2) Перейти к фильтрации запросов
3) Затем выберите вкладку HTTP-глаголы.
4) Я обнаружил, что PUT и другие глаголы допустили ложное отклонение, но не смог просто отредактировать, поэтому я удалил глагол, затем либо на панели справа выберите команду "позволить глагол", либо щелкните правой кнопкой мыши по списку и выберите его. Введите глагол, с которым у вас проблемы, и вуаля!

Надеюсь, это поможет кому-то!