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

WCF REST с jQuery AJAX - удаление/работа с той же политикой происхождения

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

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

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

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

:

Edit:
Shreddd получил это довольно много места, см. Ниже. Для этого в С# я создал следующий метод, который необходимо вызвать всем вашим методам обслуживания:

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

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

4b9b3361

Ответ 1

Вы также можете рассмотреть возможность выделения дополнительного 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

Ответ 2

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

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

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

Ответ 3

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

Так как мое приложение 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>