Настройка IIS Express 8 для включения CORS
Я пишу службы WCF, которые будут использоваться клиентами в дикой природе, поэтому им нужно обрабатывать запросы перекрестного происхождения. У меня проблема с включением моего сервера разработки для приема таких запросов. Вот сценарий:
- Я запускаю проект WCF в экземпляре Visual Studio 2012, используя IIS Express 8 в качестве сервера на определенном порту.
- Я запускаю клиентский проект в другом экземпляре Visual Studio 2012, также используя IIS Express 8 в качестве сервер. Этот проект использует AJAX для использования служб в другом проекте.
когда я запускаю клиентский проект в IE, нет проблем, потому что IE не отправляет запрос параметров предполетной подготовки. Когда я запускаю его в Chrome, однако запрос параметров предполетной подготовки возвращает метод 405, не разрешенный, и Chrome отказывается от службы. Предыдущие версии Chrome просто проигнорируют ошибку и продолжат фактический запрос POST (или Get, что угодно...) но более поздние версии разборчивее.
Я также столкнулся с этим с развернутым проектом WCF и решил его, переместив OPTIONSVerbHandler в верхнюю часть списка сопоставлений обработчиков в IIS.
Я должен отметить, что я использую самую щедрую сеть.настройки конфигурации, которые я могу придумать, чтобы попытаться разрешить CORS. Например, у меня есть это в конфигурации проекта WCF:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="*" />
<add name="Access-Control-Allow-Methods" value="*" />
<add name="X-Powered-By" value="*" />
</customHeaders>
</httpProtocol>
независимо от того, все клиентские запросы перекрестного происхождения к проекту WCF, запущенному из кода, завершаются с ошибкой 405 ошибка.
любая помощь в настройке самого проекта WCF или IIS Express 8 для включения CORS?
спасибо!
4 ответов
вы можете включить cors для wcf, и это может быть довольно просто, как только вы знаете, как.
разработка Из ответа DavidG на более общий вопрос "cors на IIS", ответ, который действительно близок к тому, что требуется для базового решения:
-
во-первых, настройки
OPTIONSVerbHandler
для выполнения перед обработчиками .Net.- в консоли IIS выберите "сопоставления обработчиков". (Сделайте это либо на уровне сервера, либо на уровне сайта. На месте уровень он переопределит все обработчики для вашего сайта и проигнорирует любые изменения, сделанные на уровне сервера после этого. И, конечно, на уровне сервера это может сломать другие сайты, если им нужна собственная обработка глагола опций.)
- в области действий выберите " Просмотреть список заказов...". Искать
OPTIONSVerbHandler
, и переместить его вверх (много кликов...).
вы также можете сделать это в интернете.config путем переопределения всех обработчиков в
<system.webServer><handlers>
. (<clear>
затем<add ...>
их обратно, это то, что делает Консоль IIS для вас. Кстати, нет необходимости запрашивать разрешение "read" на этот обработчик.) -
во-вторых, настройте пользовательские заголовки http для ваших потребностей cors, таких как:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*"/> <add name="Access-Control-Allow-Headers" value="Content-Type"/> <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/> </customHeaders> </httpProtocol> </system.webServer>
в этом примере задайте их для всех ответов на все запросы на сайте / приложении / каталоге, в котором находится веб.конфиг. Если вы хотите ограничить их некоторым url-адресом, поместите это в
<location>
тег.
Эти пользовательские заголовки также можно добавить в консоль IIS.
это базовое решение, так как он будет отправлять заголовки CORS даже по запросу, который не требует этого, возможно, открытие вашего приложения для неожиданных применений. Но с WCF это выглядит как самый простой.
С MVC или webapi мы могли бы вместо этого обрабатывать OPTIONS
заголовки глаголов и cors по коду (либо" вручную", либо со встроенной поддержкой, доступной в последней версии webapi).
- как значение допустимо только для Access-Control-Allow-Origin. Для остальных нужно быть откровенным. Например:
Access-Control-Allow-методы: GET, PUT, POST, DELETE
или же:
Access-Control-Allow-методы: PUT, DELETE
потому что спецификация говорит, что GET и POST подразумеваются.
ответ заключается в том, что конфигурация, необходимая для того, чтобы WCF мог принимать сообщения CORS preflight, не имеет ничего общего с сервером IIS; скорее, сам проект WCF должен быть настроен для обработки HTTP-запроса с помощью команды OPTIONS.
короче говоря: делать это очень сложно. WCF-это гнездо всех сделок, когда дело доходит до конечных точек, поэтому настройка его для выполнения чего-то очень конкретного с одним (HTTP) не рекомендуется, хотя это можно сделать. Реальное решение-использовать Web API, который является мастером HTTP и может быть настроен для выполнения CORS очень просто.
Я просто хотел упомянуть, что на момент написания этой статьи я не верю, что веб-браузеры поддерживают значение * wildcard для Access-Control-Allow-Methods
или Access-Control-Allow-Headers
даже если это в спецификации.
Spec:
https://www.w3.org/TR/cors/
https://tools.ietf.org/html/rfc2616#section-4.2
см. примечания по совместимости (проще чтение):
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers
вместо вышеизложенного, лучшие решения, это означает, что вы должны явно укажите каждый заголовок или метод, который вы хотите разрешить.