У меня есть веб-сервис, который я размещаю на своей машине. Я использую Windows 7 и IIS 7.5.
В файле журнала IIS я вижу, что это отклонено, потому что глагол POST не разрешен.
Веб-сервис построен с использованием WCF.
Ответ 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 работать без частичного решения "пользовательского заголовка", я открытые для этих решений.