Подтвердить что ты не робот

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, который использует аутентификацию по формам, - и службе необходимо использовать те же учетные данные, что и сайт. )

4b9b3361

Ответ 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 или нет, потому что это зависит от клиента (браузера).