WCF REST с JQuery AJAX - удаление / работа с той же политикой происхождения - PullRequest
10 голосов
/ 10 июня 2010

Итак, я пытаюсь создать службу CEST WCF REST, которая вызывается jQuery.Я обнаружил, что jQuery требует, чтобы вызовы AJAX выполнялись в соответствии с той же политикой происхождения.У меня есть несколько вопросов о том, как мне поступить.

Я уже в курсе;
1. Хакерское решение JSONP с обратным вызовом сервера
2. Слишком большая нагрузка на сервер из-замеждоменный прокси.
3. Использование Flash в браузере для вызова и настройка crossdomain.xml в корневом каталоге моего WCF-сервера.

Я бы не хотел использовать их, потому что
1. Я не хочу использовать JSON, или, по крайней мере, я не хочу ограничиваться его использованием
2. Я хотел бы отделить сервер, который обслуживает статические страницы, от сервера, который обслуживает состояние приложения.
3. Про Flash в наше время не может быть и речи.

О чем я думаю: есть ли что-нибудь похожее на файл crossdomain.xml, который работает для jQuery?Является ли эта политика «того же происхождения» частью jQuery, или это ограничение в определенных браузерах?Если это просто часть jQuery, возможно, я попытаюсь покопаться в коде, чтобы обойти его.





Редактировать:
У Шреддда все получилось, см. Ниже.Чтобы сделать это в C #, я создал следующий метод, который должны вызывать все ваши сервисные методы:

private void BypassCrossDomain()
{
  WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
}

Важно отметить, что это допускает атаки с использованием межсайтовых сценариев, и вы также не можете использовать "* "когда вам нужно отправить сторонние куки с вашим запросом.

Ответы [ 3 ]

5 голосов
/ 16 июля 2010

Вы могли бы также рассмотреть возможность размещения дополнительного http-заголовка, который разрешит междоменные запросы в вашем веб-сервисе.

Это описано здесь:

http://www.w3.org/TR/cors/

https://developer.mozilla.org/en/HTTP_access_control

Итак, если вы добавите следующий заголовок к любому контенту, который доставляет ваш веб-сервис:

Access-Control-Allow-Origin: *

браузер будет разрешать междоменные запросы к этому веб-сервису. Это поддерживается в большинстве современных браузеров (ff 3.5, IE 8, safari 4) и, кажется, очень хорошо работает для jquery-приложений, размещенных на домене foo.com, которые делают ajax-вызовы bar.com

1 голос
/ 10 июня 2010

К сожалению, политика одного и того же происхождения - это ограничение браузеров, а не явная часть jQuery, поэтому я сомневаюсь, что вы найдете способ обойти это.

Я бы посоветовал вампридерживаться решения JSONP.Да, вы можете утверждать, что это «хакер», но это очень распространенный «хак» именно по тем причинам, с которыми вы сталкиваетесь (т.е. это один из единственно возможных вариантов).

Что касается ограничениячтобы использовать JSON, если вы контролируете оба конца вызова службы, нет никаких причин, по которым вы не могли бы использовать шаблон использования стиля JSONP, но на самом деле не использовали JSON ... Ваш ответ сервера просто будет переданJavaScript-функция на стороне клиента, поэтому вы не сможете помешать вам вернуть, скажем, XML в строку, а затем проанализировать и обработать ваш обратный вызов (хотя это, вероятно, толкает вас на действительно «хакерскую» территорию).

0 голосов
/ 06 июня 2012

Два дня охоты, и вот наконец я нашел это!чем вы csuave!

Поскольку мое приложение WCF размещается самостоятельно (добавление xml в app.config и web.config не помогло), но это работает!

private void BypassCrossDomain()
{
  WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-      Origin", "*");
}

- неработа для самостоятельной работы:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin"
             value="*" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

...