Ааа, наконец-то я нашел решение своего 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