Метод CORS 405 не допускается

Я слежу за статьей Mozilla о том, как настроить мой сайт, чтобы разрешать запросы на межсайтовый скриптинг. Используя диспетчер IIS, я добавил следующие заголовки ответов HTTP

Access-Control-Allow-Origin  : *
Access-Control-Allow-Headers : Origin, SecurityPrivateKeyID
Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS

Несмотря на это, я продолжаю получать 405 Method Not Allowed, когда мои браузеры (Firefox и Chrome) отправляют запрос перед полетом с пользовательским заголовком SecurityPrivateKeyID.

Запрос

OPTIONS /Service/Json/User.svc/ HTTP/1.1
Host: serviceprovider.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://client.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: securityprivatekeyid
Connection: keep-alive

Ответ

HTTP/1.1 405 Method Not Allowed
Allow: GET
Content-Length: 1565
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/8.0
access-control-allow-origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Origin, SecurityPrivateKeyID
Date: Sat, 23 Mar 2013 08:35:03 GMT

Сервис работает отлично при непосредственном доступе к http://serviceprovider.com/Service/Json/User.svc/.

Любые идеи о том, что я делаю неправильно?

[примечание Я изменил файлы хостов, чтобы указать client.com и serviceprovider.com на моем компьютере]

[решение с использованием JSONP не будет выполняться, так как мой веб-сервис должен иметь возможность использовать POST, PUT и DELETE methos]

Ответ 1

Мой экземпляр IIS 8 - это новая установка, кажется, мне нужно внести некоторые изменения в Handler Mappings

Конфигурация резервного копирования IIS

В случае, если любая из предложенных изменений нарушит существующие веб-сайты, лучше всего сделать резервную копию файла applicationhost.config

  • Перейдите к C:\Windows\System32\inetsrv\config
  • Сделайте копию applicationhost.config

Удалить неиспользуемые обработчики

В качестве отправной точки я удалил все неиспользуемые сопоставления обработчиков для уменьшения проблемного пространства. Вы можете сделать это, изменив applicationhost.config напрямую или с помощью диспетчера IIS

  • Откройте диспетчер IIS
  • Либо на сервере node, либо на отдельном веб-сайте node выберите функцию сопоставления обработчиков
  • Вручную удалите все сопоставления, которые вам не нужны.

Мои сайты в значительной степени основаны на сервисах и зависят от статических файлов и файлов с расширениями файлов .aspx и .svc. Я также вручную удалил все ссылки на .NET 2.0 в файле конфигурации.

Добавить обработчик OPTIONS

Кажется, это исправление.

  • Откройте диспетчер IIS
  • Либо на сервере node, либо на отдельном веб-сайте node выберите функцию сопоставления обработчиков
  • В столбце lefthand выберите Add Module Mapping
  • В диалоговом окне Add Module Mapping используйте следующие значения.
    • Request path - *
    • Module - ProtocolSupportModule
    • Executable - [Оставить пустым]
    • Name - [Что бы вы ни хотели]
  • Нажмите Request Restrictions
    • На вкладке Mapping отключите Invoke handler only if request is mapped to
    • На вкладке Verbs выберите OPTIONS
    • На вкладке Access выберите Script

Моя конфигурация обработчиков выглядит так:

<handlers accessPolicy="Read, Script">
    <add name="OPTIONS" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" />
    <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" />
    <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
    <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
    <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>

Ответ 2

Для моего экземпляра:

  • Убедитесь, что запросы "Access-Control-Allow-Headers" и "Access-Control-Allow-Methods" в запросе меньше или равны, чем в ответе. (Не используйте "*" )

  • Удалите эту строку <remove name="OPTIONSVerbHandler" /> в Web.config

Ответ 3

В моем случае мне пришлось перейти к Handler Mappings, переключиться на Ordered View, а затем переместить OPTIONSVerbHandler полностью в верхнюю часть списка.