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

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

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

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

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

Может быть, есть еще что-то, что нужно настроить в IIS, чтобы разрешить эти запросы?

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


person buhtla    schedule 26.11.2010    source источник
comment
Убедитесь, что вы установили .NET 4.0 на компьютер. Убедитесь, что вы видите это: support.microsoft.com/kb/2015129.   -  person    schedule 22.06.2013


Ответы (6)


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

  1. В IIS 7.5 -> Ваш веб-сайт -> Сопоставления обработчиков
  2. Выберите опцию «Добавить сопоставление модулей» в правой части панели.
  3. В поле «Путь запроса» введите *.wsdl
  4. В поле «Модуль» введите «ProtocolSupportModule».
  5. Нажмите «Запросить ограничения» и перейдите на вкладку «Глаголы».
  6. Введите глагол POST
  7. Сохранить изменения

Конец вуаля, скрипач больше не отвечает 405, а счастливо 200.

person buhtla    schedule 26.11.2010
comment
Buhtla, если это ответ, который решил проблему для вас, отметьте его как таковой зеленой галочкой. Это разрешено (и поощряется) на SO. - person Peter; 24.04.2012
comment
Как вы узнали об этом @buhtla? Это сработало для меня: большое спасибо! Но я думаю, что было бы также полезно опубликовать URL-адрес, откуда вы получили эту информацию, и, пожалуйста, отметить как ответ, потому что другим будет легче найти решение. - person Fabio Milheiro; 12.07.2012
comment
Я очень рад, что помог вам, ребята! Прошло довольно много времени после того, как у меня возникла эта проблема, но я помню, что нашел это решение самостоятельно. Может есть какие-то страницы, на которых такое же решение описанной проблемы, но я о них не в курсе. - person buhtla; 01.10.2012
comment
Мне тоже помогло, вы молодец! - person UMAR-MOBITSOLUTIONS; 24.02.2014

Перечисленный ответ не сработал для меня, но я смог решить проблему, запустив

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

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

person Jeremy Hutchinson    schedule 11.01.2013

Перейдите в Диспетчер IIS -> Выберите веб-сайт -> Сопоставление обработчика -> Выберите обработчик -> щелкните правой кнопкой мыши и выберите «Редактировать» -> Ограничения запроса -> вкладка глаголов

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

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

person Aliostad    schedule 26.11.2010
comment
Да, но для какого обработчика? У меня нет специального обработчика для расширения wsdl. - person buhtla; 26.11.2010
comment
Для веб-служб (*.asmx) WebServiceFactoryHandler - person Aliostad; 26.11.2010
comment
Я реализую это с помощью WCF, так что на самом деле это расширение .svc. Я уже проверил, и для расширения svc разрешены все глаголы. Тем не менее я получаю ту же ошибку... - person buhtla; 27.11.2010
comment
Также следует добавить, что POST разрешен для всех обработчиков asmx. - person buhtla; 27.11.2010
comment
Я наконец нашел решение. Я разместил это как ответ. Спасибо, в любом случае. - person buhtla; 27.11.2010

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

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

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

person Daniel Hursan    schedule 14.05.2014

Оказывается, у меня не включена HTTP-активация WCF. Решение здесь: WCF на IIS8; * сопоставление обработчика .svc не работает

person northben    schedule 03.10.2014

Ааа, наконец-то я нашел решение своего CORS в аду IIS. Это была одна из проблем, возникших во время поиска решения.

Правильный ответ - aliostad. Проблема возникает из-за того, что для некоторых решений для реализации глагола «ОПЦИИ» было рекомендовано удаление сопоставления этого глагола с 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 работать без частичного решения «настраиваемый заголовок», я открыт для тех решения.

person Gerard ONeill    schedule 08.02.2017