Eugene Agafonov on the .NET

Блог Евгения Агафонова

IIS 8, HTTP OPTIONS, CORS и ASP.NET Web API

Gollum Gollum
Сегодня столкнулся с интересной проблемой. На одном из web api под IIS 8 не работала поддержка CORS из nuget-пакета Thinktecture.IdentityModel. Что это такое, и как это конфигурируется можно посмотреть здесь и здесь

Просмотр запросов с помощью fiddler дал понять, что в ответ на http запрос OPTIONS сервер отвечает простым ответом ОК без указания нужных заголовков, в частности — Access-Control-Allow-Origin.

Опытным путем обнаружилось, что если на сервере включить опцию RAMMFAR ( runAllManagedModulesForAllRequests="true"), то delegating handler для поддержки CORS начинает работать. Однако включать эту опцию не очень хотелось, пусть даже она влияет не на все managed модули, поэтому я продолжил исследования дальше.

Выяснилось что в моем случае в IIS установлен еще один хэндлер — OPTIONSVerbHandler. Как только я его убрал в web.config, приложение стало работать нормально при выключенной опции RAMMFAR.

В итоге web.config получился такой:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="false">
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV"/>
        <remove name="OPTIONSVerbHandler"/>
        <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="%windir%\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="%windir%\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" />
    </handlers>
</system.webServer>


То же самое на моем персональном блоге: http://eugeneagafonov.com/post/38312924785/iis-options-cors-aspnet-webapi-ru