Межсайтовый вызов ajax к службе WCF - PullRequest
3 голосов
/ 17 февраля 2009

Возможно ли сделать межсайтовый вызов в Javascript службе WCF?

Я не против, если это POST или GET.

Но я слышал, что в наши дни браузеры не разрешают межсайтовые звонки с помощью POST или GET.

Как я могу обойти это и при этом позвонить в WCF Service ?

Ответы [ 4 ]

5 голосов
/ 17 февраля 2009

Не так много можно сделать, чтобы обойти браузерные блокировщики межсайтовых сценариев. Эти блокировщики предотвращают возникновение XMLHTTPRequest с любым доменом, кроме того, который загружал содержащий скрипт или страницу.

Тем не менее, есть один часто используемый обходной путь: используйте JavaScript, чтобы написать новую запись в DOM, которая ссылается на src, который является межсайтовым URL. Вы передадите все свои аргументы метода RPC этому «сценарию», который вернет некоторый JavaScript, который будет выполнен, сообщая вам об успехе или неудаче.

Нет способа сделать POST таким образом, URL-адрес src должен быть GET, чтобы вы могли передавать аргументы таким образом. Я не уверен, что в WCF есть метод доступа «GET only». И, поскольку браузер будет ожидать, что результатом удаленного тега будет действительный объект JavaScript, вам необходимо убедиться, что ваша служба WCF также подчиняется этому, в противном случае вы получите ошибки JavaScript.

Еще один распространенный метод обхода межсайтовых скриптов - это создание прокси для ваших запросов. Другими словами, если вы хотите получить доступ к домену test.com из сценариев, размещенных на example.com, создайте URL-адрес на example.com, который правильно перенаправит запрос на test.com.

Для вашего примера прокси-сервер, вероятно, является правильным ответом, если предположить, что WCF не имеет собственных ограничений межсайтового скриптинга.

4 голосов
/ 21 февраля 2009

Вы случайно используете jQuery? jQuery поддерживает междоменные запросы JSON с использованием «JSONP». Вы будете ограничены запросами GET, но я попробовал это, и это работает хорошо! Также очень просто начать работать.

Подробнее см. В разделе «Кросс-доменный getJSON (используя JSONP)» на этой странице: http://docs.jquery.com/Release:jQuery_1.2/Ajax

А вот некоторые сведения о JSONP: http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/

Дайте мне знать, как это происходит!

2 голосов
/ 21 февраля 2009

Новые рекомендации W3C стандартизированы, чтобы разрешить межсайтовые запросы между доверенными сторонами через Контроль доступа для межсайтовых запросов спецификация.

Для этого требуется сервер, обслуживающий подходящие HTTP-заголовки Access Control, и браузер, способный понимать такие заголовки и работать с ними.

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

В настоящее время очень немногие браузеры поддерживают эту функцию. IE8, по-видимому, делает (я не проверял это), а Firefox 3.1 (я это тщательно проверял). Я ожидаю, что другие браузеры последуют его примеру довольно быстро.

Не следует ожидать достаточного внедрения совместимых браузеров до 2012 года.

Это окончательное решение проблемы. Недостатком является ожидание нескольких лет, прежде чем его можно будет использовать в основных приложениях.

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

1 голос
/ 21 февраля 2009

Чтобы расширить ответ Бена ... Я расширил наш сервис WCF для поддержки вызовов JSONP из jQuery, используя код, похожий на этот пример от Microsoft:

http://msdn.microsoft.com/en-us/library/cc716898.aspx

...