Ошибка IIS 7.5, веб-службы и HTTP 405

У меня есть веб-сервис, который я размещаю на своей машине. Я использую Windows 7 и IIS 7.5.

Проблема. Когда клиент пытается использовать веб-службу, он получает ошибку HTTP 405.

В файле журнала IIS я вижу, что это отклонено, потому что глагол POST не разрешен.

Вопрос. Как я могу разрешить глагол POST для этих запросов?
Нужно ли добавлять отображение WSDL файла? И если да, как мне настроить это сопоставление? Я проверил, и в существующих сопоставлениях у меня нет ничего для расширения WSDL.

Возможно ли еще что-то настроить на IIS, чтобы разрешить эти запросы?

Веб-сервис построен с использованием WCF.

Ответ 1

После нескольких часов борьбы это окончательное решение, которое помогло мне (протестировано от скрипача):

  • В IIS 7.5 → YourWebsite → Отображения обработчиков
  • Выберите "Добавить модульное сопоставление" в правой части панели.
  • В поле "Запрос пути" введите *.wsdl
  • В поле "Модуль" введите "ProtocolSupportModule"
  • Нажмите "Запросить ограничения" и перейдите на вкладку "Глаголы".
  • Введите команду POST
  • Сохранить изменения

End voila, fiddler больше не отвечает с 405, а со счастливым 200.

Ответ 2

Указанный ответ не помог мне, но я смог исправить проблему, запустив

"% WINDIR%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r

Это перерегистрирует отображение обработчика для *.svc

Ответ 3

Перейти к диспетчеру IIS → Выбрать веб-сайт → Отображение обработчика → Выбрать обработчик → щелкните правой кнопкой мыши и выберите править → Запросить ограничения → вкладка глаголов

Измените значение там.

В зависимости от вашего расширения он может быть другим обработчиком.

Ответ 4

Для людей, которые сталкиваются с этой страницей, но обращаются к веб-приложению с страницами aspx, а не к службам, стоит отметить одну важную вещь.

Если вы сделаете запрос на отправку http-ответа для скрипача на http://localhost/MyApplication, он переместит статус 405. Но если вы укажете http://localhost/MyApplication/Default.aspx вместо этого, он будет отвечать правильно (со статусом 200)

Надеюсь, это поможет. Я искал не то место в течение часа, отлаживал обработчики, модули, настройки webdav, http-глаголы и т.д.

Ответ 6

Ahh - Наконец-то я нашел решение для моего CORS на адском ИИС. Это была одна из проблем, возникших во время поиска решения.

Правильный ответ - aliostad - проблема возникает из-за того, что для некоторых решений для реализации глагола "OPTIONS" было рекомендовано удаление отображения этого глагола в ProtocolSupportModule. Или, возможно, кто-то просто очистил ненужные сопоставления и т.д. Это не оставило обработчика OPTIONS.

Я не эксперт в том, что происходит за кулисами, но похоже, что IIS гарантирует, что есть потенциальный обработчик для запроса задолго до запуска события Application_BeginRequest, несмотря на их диаграммы последовательности:

https://msdn.microsoft.com/en-us/library/bb470252.aspx

Таким образом возвращается статус 405 без выполнения вашего модуля. Например, отправление на сервер:

OPTIONS http://www.example.com/path/mypage.aspx

Итак, IIS ищет обработчик для *.aspx, который принимает глагол OPTIONS. Если вы посмотрите на файл applicationHost.config по умолчанию, вы увидите, например:

        <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
        <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
        <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />

Я только что сделал следующее в моем web.config, чтобы IIS перестала возвращать статус 200 noops:

        <remove name="OPTIONSVerbHandler" />

Итак, сначала попробовав его и сделав вывод, что это то, что нужно, я добавил следующее в свой web.config:

        <remove name="PageHandlerFactory-ISAPI-4.0_32bit" />
        <remove name="PageHandlerFactory-ISAPI-4.0_64bit" />
        <remove name="PageHandlerFactory-Integrated" />
        <remove name="PageHandlerFactory-Integrated-4.0" />

        <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
        <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
        <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />

Обратите внимание, что замены соответствуют тому, что находится в applicationHost.config, за исключением того, что добавлен дополнительный ключ OPTIONS в каждую строку.

Для тех из вас, кто использует маршрутизацию (например, MVC или webapi):

        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

        <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="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" />

Наконец, я не эксперт IIS - возможно, существует другой более эффективный способ обработки глагола OPTIONS для CORS (более конкретно, разрешите ваш обработчик CORS работать без частичного решения "пользовательского заголовка", я открытые для этих решений.