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?
Ответы
Ответ 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 и другие глаголы допустили ложное отклонение, но не смог просто отредактировать, поэтому я удалил глагол, затем либо на панели справа выберите команду "позволить глагол", либо щелкните правой кнопкой мыши по списку и выберите его. Введите глагол, с которым у вас проблемы, и вуаля!
Надеюсь, это поможет кому-то!