Как опубликовать, а затем перенаправить на внешний URL-адрес из ASP.Net?

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

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

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

Ответов (6)

Решение

Вот как я сегодня решил эту проблему. Я начал с этой статьи о 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>");
}

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

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

Эрик Сиппл

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

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

Если вы используете ASP.NET 2.0, вы можете сделать это с помощью межстраничной публикации .

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

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

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

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

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

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

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

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

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