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