Как отправить данные в другое веб-приложение (междоменное) - PullRequest
2 голосов
/ 21 января 2010

Пожалуйста, рассмотрите следующий сценарий,

Существует два веб-приложения: App1 и App2. Пользователь отправит свою информацию в App1 через форму. При нажатии определенной кнопки / ссылки в App1 те же данные должны быть опубликованы на странице в App2, а пользователь также должен быть перенаправлен на ту же страницу в App2.

Мне нужна помощь в поиске наилучшего способа реализации этой функциональности.

Один из подходов, которые я уже опробовал, заключается в создании временной HTML-формы во время выполнения, установке атрибута действия формы на странице App2 и получении формы с использованием отправки javascript. Затем данные можно получить на странице App2 с помощью объекта response.form.

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

Я был бы очень признателен, если бы вы могли дать некоторую информацию об использовании веб-сервисов RESTful для реализации этого, или же использовать некоторый HttpModule для перехвата запросов в App1 и изменить ответ перенаправления в app2 или любой другой подход, который вы можете найти подходящим для этой цели .

Edit: Использование строки запроса не вариант для меня.

Ответы [ 6 ]

1 голос
/ 20 мая 2010

Мне нужно было выполнить аналогичные действия с агрегацией каналов и созданием каналов rss из содержимого веб-страниц в разных доменах.

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

HTMLDocument FetchURL( string url )
{
    WebClient wc = new WebClient();
    string remoteContent = wc.DownloadString(url);
    // mshtml api is very weird but lets just say you have to do things this way ...
    HtmlDocument doc = new HTMLDocument();
    IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
    doc2.write(new object[] { remoteContent });

    return (HTMLDocument)doc2;
}

Эта функция используется для двух целей ...

  1. Получает страницу содержимого по адресу "URL"
  2. Анализирует это содержимое в объект HTMLDocument

Если у вас есть эта функция, вы можете вызвать ее, передав URL-адрес на удаленную страницу, и получить обратно HTML-документ. Функции в объекте HTMLDocument позволят вам выполнять javascript как dom-запросы, такие как:

docObject.GetElementById("id");

У меня тогда есть разные функции, которые делают разные вещи с этим объектом на основе страницы / сайта, с которого я возвращаю данные.

Однако здесь есть один роковой недостаток ...

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

С помощью stackoverflow, например, легко вывести вопрос и принятый ответ на этот вопрос, чтобы я мог использовать этот код для извлечения и публикации контента отсюда на моем собственном веб-сайте.

Однако ...

Это не поможет вам в деталях, связанных с пользователем / логином, так как такая информация не доступна для всех.

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

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

Однако вы можете объединить запросы, разорвав мой пример метода, запросив страницу входа, проанализировав результаты, заполнив форму, а затем отправив сообщение обратно, используя тот же экземпляр веб-клиента для входа в систему, затем запросив URL.

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

Лучше всего использовать его в классе, а не в простом методе, как у меня здесь.

В моем случае, хотя я был только после чего-то простого (топ-40 лучших диаграмм Би-би-си), из которого я извлек информацию не только из Би-би-си, но и из таких мест, как Amazon, Google и YouTube, затем я создал страницу:)

Это аккуратно, но не служит никакой функциональной цели, кроме перетаскивания всех ваших любимых источников информации на 1 страницу.

0 голосов
/ 21 декабря 2010

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

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

Этот элемент управления будет внутренне создавать HTML-форму с атрибутом действия, установленным на URL-адрес, указанный пользователем, и создавать поля данных из объекта словаря. Затем эта форма будет размещена на событии нажатия кнопки на странице, где размещен этот элемент управления.

0 голосов
/ 16 февраля 2010

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

(Browser) -> Submits form to App1 -> 
    (App1) -> validate input
           -> stores local info
           -> creates an HttpRequest/POST object
           -> posts to App2
      (App2) -> handles the post
      <- returns the response
    -> confirms the results of App2
  <- returns the results to the browser.

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

0 голосов
/ 28 января 2010

Вы можете использовать HttpServerUtility. Передача сохранит содержимое вашей формы и перенесет пользователя на новую страницу.

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transfer.aspx

0 голосов
/ 24 января 2010

Если вы уже взяли на себя обязательство использовать javascript, то почему бы не опубликовать сообщение ajax и изменить window.location на основе ответа?

0 голосов
/ 21 января 2010

Я создал что-то похожее на то, что вы описываете, и обнаружил, что использование тега <form> для POST для app2 - это самый надежный способ ... в принципе, способ, который вы нашли, который работал хорошо.

...