2008-08-07 2 views
26

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

HttpWebRequest отлично работает, если вы не хотите перенаправлять, а JavaScript в некоторых случаях прекрасен, но может оказаться сложным, если вам действительно нужен код на стороне сервера, чтобы собрать данные для публикации.

Итак, как вы оба отправляете сообщение на внешний URL-адрес и перенаправляете пользователя на результат из кода кода ASP.NET?

ответ

9

Вот я решил эту проблему сегодня. Я начал с this article на C# Corner, но нашел пример - в то время как технически звук - немного неполный. Все, что он сказал, было прав, но мне нужно было ударить по нескольким внешним сайтам, чтобы собрать это вместе, чтобы работать точно так, как я хотел.

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

Это решение включает в себя использование HttpContext.Current.Response.Write(), чтобы записать данные по форме, а затем, используя немного JavaScript, на методе

<body onload=""> 

отправить форму для надлежащего URL.

Когда пользователь нажимает на ссылку Центра поддержки, следующий метод вызывается, чтобы написать ответ и перенаправить пользователя:

public static void PassthroughAuthentication() 
{ 

    System.Web.HttpContext.Current.Response.Write("<body 
    onload=document.forms[0].submit();window.location=\"Home.aspx\";>"); 

    System.Web.HttpContext.Current.Response.Write("<form name=\"Form\" 
    target=_blank method=post 
    action=\"https://external-url.com/security.asp\">"); 

    System.Web.HttpContext.Current.Response.Write(string.Format("<input 
     type=hidden name=\"cFName\" value=\"{0}\">", "Username")); 

    System.Web.HttpContext.Current.Response.Write("</form>"); 
    System.Web.HttpContext.Current.Response.Write("</body>"); 
} 

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

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

Эрик Сиппл

1

Если вы используете ASP.NET 2.0, вы можете сделать это с помощью cross-page posting.

Редактировать: Я пропустил тот факт, что вы спрашиваете о внешних странице. Для этого я думаю, вам нужно, чтобы ваша страница ASP.NET-страницы отображала HTML-форму, действие которой установлено на удаленный URL-адрес, а метод установлен на POST. (Используя межстраничную проводку, это может быть даже другая страница без пользовательского интерфейса, только скрытые элементы формы.) Затем добавьте немного javascript для отправки формы, как только результат обратной передачи будет получен на клиенте.

1

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

Я построил для этого класс утилиты, содержащий удаленный URL-адрес и коллекцию пар имя/значение для формы.

Межстраничная проводка будет работать, если у вас есть обе страницы, но нет, если вам нужно отправить сообщение на другой сайт (например, PayPal).

2

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

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

Оттуда, вы можете просто сделать Response.Redirect, или, возможно, вам нужно менять свое действие, основанное на результатах пост (если была ошибка, отобразить ее пользователю или что-то еще). Я думаю, что у вас уже был ответ на ваш вопрос, если честно - звучит так, будто вы думаете, что это сообщение ИЛИ перенаправление, когда на самом деле вы можете сделать их как из своего кода позади.

4

Я начал с этим, например, из CodeProject

Тогда вместо добавления на страницу, я заимствован из saalon (выше) и сделал Response.Write().

1

мне нужно открыть в том же окне, касающийся возможных проблем кадров с исходной страницы, а затем перенаправлять на внешний сайт в код:

Private Sub ExternalRedirector(ByVal externalUrl As String) 
    Dim clientRedirectName As String = "ClientExternalRedirect" 
    Dim externalRedirectJS As New StringBuilder() 

    If Not String.IsNullOrEmpty(externalUrl) Then 
     If Not Page.ClientScript.IsStartupScriptRegistered(clientRedirectName) Then 
      externalRedirectJS.Append("function CheckWindow() {") 
      externalRedirectJS.Append(" if (window.top != window) {") 
      externalRedirectJS.Append("  window.top.location = '") 
      externalRedirectJS.Append(externalUrl) 
      externalRedirectJS.Append("';") 
      externalRedirectJS.Append("  return false;") 
      externalRedirectJS.Append(" }") 
      externalRedirectJS.Append(" else {") 
      externalRedirectJS.Append(" window.location = '") 
      externalRedirectJS.Append(externalUrl) 
      externalRedirectJS.Append("';") 
      externalRedirectJS.Append(" }") 
      externalRedirectJS.Append("}") 
      externalRedirectJS.Append("CheckWindow();") 

      Page.ClientScript.RegisterStartupScript(Page.GetType(), clientRedirectName, externalRedirectJS.ToString(), True) 
     End If 
    End If 
End Sub 
Смежные вопросы