Вопрос

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

Я не против, будет ли это POST или GET.

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

Как я могу обойти это и по-прежнему вызывать Служба WCF?

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Вы случайно не используете 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/

Дайте мне знать, как идут дела!

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top