2009-08-07 4 views
4

У нас есть приложение ASP.Net, размещенное в нашей сети и доступное для конкретного клиента. Этот клиент хочет иметь возможность импортировать данные со своего сервера в наше приложение. Данные извлекаются с помощью HTTP-запроса и форматируются в формате CSV. Проблема в том, что они не хотят раскрывать свой сервер в нашей сети и запрашивают, чтобы импорт выполнялся на стороне клиента (все клиенты из той же сети, что и их сервер).Доступ к междоменным данным в JavaScript

Итак, что нужно сделать, это:

  1. Они запросить страницу импорта с нашего сервера
  2. Сценарий клиента на странице выдает запрос на своем сервере, чтобы получить CSV отформатированные данные
  3. Данные отправляются обратно в нашу заявку

Это не проблема, когда оба сервера находятся в одном домене: простой скрытый iframe или что-то подобное сделают трюк, но вот что я получение - это междоменная ошибка «отказа в доступе». Они также отказываются изменять формат данных, чтобы возвращать данные в формате JSON или XML.

То, что я пытался и узнал до сих пор:

  1. Hidden IFrame - «доступ запрещен»
  2. XMLHttpRequest - поведение зависит от настроек безопасности браузера: может работать, может работать в то время как нытье пользователя с предупреждениями о безопасности, или не может работать на всех
  3. динамических тегов сценария - работали бы, если они могли бы возвращены данные в формате JSON
  4. клиентских данных IE связывания - тот же «доступ запрещен» ошибка

Есть ли что-нибудь еще, что я могу попробовать, прежде чем сдаваться и сказать, что это невозможно, не подвергая их серверу нашему приложению, изменяя их формат данных или изменяя настройки безопасности браузера? (Кстати, трюк DNS не является опцией).

ответ

2

Это может быть слишком поздно для вашего клиента, но поскольку у вас есть контроль над обоими доменами, вы можете попробовать EasyXDM. Это библиотека, которая обертывает кросс-браузерные причуды и предоставляет простой в использовании API для обмена в клиентском сценарии между разными доменами, используя наилучший доступный механизм для этого браузера (например, postMessage, если он доступен, другие механизмы, если нет).

Предостережение: вам необходимо иметь контроль над обоими доменами, чтобы заставить его работать (где «управление» означает, что вы можете разместить статические файлы на обоих из них). Но вам не нужны изменения кода на стороне сервера.

+0

Привет, я больше не работаю, и я даже не помню всех деталей проблемы, но спасибо за хорошую ссылку! :) – vit

+0

В любом случае, поскольку это решило бы исходную проблему, я буду принимать это как ответ. – vit

3

JSONP может быть для вас ответом, если они могут передавать данные сервера в формате JSON. Помимо этого вы всегда будете сталкиваться с проблемами Same Origin Policy с междоменными вызовами. Вы изучали выполнение вызовов на стороне сервера для выполнения HTTP-запросов на их сервере?

+0

Нет, их сервер недоступен с нашего сервера. – vit

+0

Я обнаружил, что jsonp будет работать, но вы можете столкнуться с проблемами, если ваша служба защищена аутентификацией windows/ntlm. – David

1

Ваш клиент JavaScript, обслуживаемый вашим приложением, не так ли?

Возможно, ваш клиент может отправлять запросы на ваше приложение (предотвращение межсайтового скриптинга), что вы видите ошибку?

Предполагая, что да, тогда решение заключается в том, чтобы ваше приложение предлагало услугу «прокси». Код браузера может запрашивать у вашего сервера некоторые данные. Ваш сервер может выдать Http-запрос любому серверу, которому он нравится (без браузера для объекта). Таким образом, вы реализуете небольшое обслуживание, чтобы получить данные cvs и представить его в своем приложении.

Возможно, вы даже захотите отобразить данные CSV в JSON, если это ваш клиент, который его использует.

+0

Прокси не будет работать, поскольку их сервер будет виден только из собственной сети и недоступен с нашего сервера. – vit

+1

Так что их браузеры могут видеть вас и их серверов. Но вы не можете видеть их серверы. (извинился, что ты все это сказал в вопросе.) Довольно сложно пройти. – djna

0

Не можете ли вы разместить только JS-файл на своем сервере? Это должно позволить скрипту в этом файле делать ajax-обратные вызовы на свой сервер.

+1

Нет - политика того же самого происхождения относится к домену, на который была отправлена ​​* страница *, а не домен, на который был отправлен * скрипт *. – NickFitz

+0

Вы правы, позор мне :) – JonoW

0

Вы можете попробовать использовать вспышку. Если вы поместите этот файл yourdomain.com/crossdomain.xml в корневом каталоге, вы сможете делать запросы на междоменные запросы с сайта mysite.com.

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
<allow-access-from domain="www.mysite.com" to-ports="25" /> 
</cross-domain-policy> 
+0

Не следует ли размещать его на сервере? Я возвращаю данные, а не наш собственный сервер? – vit

+0

Как я понял, у вас нет прямого доступа к их серверу. Поэтому, если в CSV-странице есть страница из необходимой информации, эта страница может отправлять данные в ваш домен со вспышкой. –