JQuery AJAX CORS с WCF-сервисом ASP.NET не работает, несмотря на записи web.config
Я пытаюсь понять, что мне не хватает в моем подходе, что предотвращает доступ к моей службе WCF. Если я попытаюсь получить доступ к службе через запрос AJAX из того же домена, нет проблем.
Я принял совет, который я видел в другом месте на сайте, чтобы добавить тег <httpProtocol>
в web.config, чтобы включить CORS, но он, похоже, не работает (обратите внимание на первые несколько элементы в customHeaders существуют по разным причинам безопасности):
<location path="FooBar.svc">
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Request-Method" value="POST"/>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, X-Requested-With, X-Custom-Header" />
</customHeaders>
</httpProtocol>
</system.webServer>
</location>
Несмотря на это, я все еще получаю сообщение об ошибке (используя IE Developer Tools) при попытке вызвать службу с отдельной страницы: "XMLHttpRequest для... требуется перекрестный поиск ресурсов (CORS)"
Мой jQuery ajax call (Post) имеет значения, установленные для использования с CORS:
crossDomain: true,
xhrFields: { withCredentials: true },
Я даже попытался добавить исправление для потенциальных проблем IE XDR, от https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js без эффекта (я использую IE11, поэтому я не ожидал этого)
У кого-нибудь есть идеи относительно того, что здесь может быть неправильным?
(EDIT: сама служба настроена с этими атрибутами, если она имеет значение:
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json)]
)
(EDIT 2: В случае, если это имеет смысл, служба должна быть частью сайта HTTPS, который использует аутентификацию по формам, - и службе необходимо использовать те же учетные данные, что и сайт.
)
Ответы
Ответ 1
Включение CORS в true на серверном сервере, на котором размещается служба, в идеале должно решить проблему. Однако есть еще один способ... У вас может быть оболочка между кодом jQuery и службой WCF ( Примечание:. Это один из подходов, который вы должны предложить в команде, когда у вас нет доступа для изменения, например, файла htaccess в apache, где мы установили CORS для доступа к другому домену, обращающемуся к нашей службе). Итак, подход идет так...
jQuery Code -> Wrapper (Webmethod in .NET) -> WCF service
Код jQuery и Wrapper находятся в одном домене. jQuery вызывает webmethod, который, в свою очередь, вызывает вызов соответствующего метода службы WCF для получения данных. Падение этого подхода состоит в том, что запрос проходит через еще один слой, поэтому в начале я упомянул "Заметка".
Ответ 2
Ваш раздел <customHeaders>
web.config настроен для запросов CORS без учетных данных. Вам нужна другая конфигурация, чтобы разрешить запросы CORS с учетными данными:
-
Задайте дополнительный Access-Control-Allow-Credentials
заголовок true
.
Заголовок -
Access-Control-Allow-Origin
не может быть установлен на *
. Вы должны вернуть совпадение с учетом регистра для запроса корса/хоста запроса CORS.
Источник: 7.2 Проверка доступа к ресурсам (рекомендация W3C для совместного использования ресурсов для разных источников)
Ответ 3
Если ваша служба находится на HTTPS, и если вы используете самоподписанный SSL-сертификат, то перекрестные вызовы домена будут Fail, несмотря на то, что web.config
установлен для заголовка Access-Control-Allow-Origin
. Вам следует попробовать импортировать Valid SSL Certificate в свой IIS и посмотреть, что вы получаете.
Ответ 4
Вы пытались использовать $.support.cors = true в jquery.
Ответ 5
С WCF вам нужно сделать больше, чем просто добавить пользовательские заголовки в web.config
. Простое редактирование web.config
достаточно для ASP.NET Web API, но если это не то, над чем вы работаете, вам нужно добавить собственный код, чтобы разрешить заголовок OPTIONS
внутри вашего веб-сервиса. В принципе, вам нужно создать инспектор сообщений, а затем некоторое поведение конечной точки, которое использует класс инспектор сообщений для добавления необходимых заголовков.
Для кода и примера сервиса см. страницу WCF на странице enable-cors.org.
Ответ 6
Попробовали добавить Access-Control-Allow-Origin
в заголовке в Response
следующим образом (только если вы хотите, чтобы ваша служба WCF была доступна из любого домена),
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin","*");
В одном из методов Web API я использовал UrlReferrer
для этого.
Код выглядит следующим образом
Uri referredURL = HttpContext.Current.Request.UrlReferrer;
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://" + referredURL.Host);
Но этот метод мало рискован, так как не гарантируется, получится ли вы UrlReferrer
или нет, потому что это зависит от клиента (браузера).