IIS 7.5, веб-служба и ошибка HTTP 405 - PullRequest
10 голосов
/ 26 ноября 2010

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

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

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

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

Может ли быть другая настройка в IIS для разрешения этих запросов?

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

Ответы [ 6 ]

14 голосов
/ 27 ноября 2010

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

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

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

7 голосов
/ 11 января 2013

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

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

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

2 голосов
/ 26 ноября 2010

Перейти к IIS Manager -> Выбрать веб-сайт -> Сопоставление обработчиков -> Выбрать обработчик -> щелкните правой кнопкой мыши и выберите Изменить -> Запрос ограничений -> вкладка глаголов

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

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

1 голос
/ 14 мая 2014

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

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

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

0 голосов
/ 08 февраля 2017

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

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

0 голосов
/ 03 октября 2014

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

...