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

StackOverflow https://stackoverflow.com/questions/5179

Вопрос

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

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

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

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

Решение

Вот сегодня я решил эту проблему.Я начал с Эта статья на 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, который при загрузке тела страницы отправляет форму, а затем перенаправляет пользователя обратно на мою домашнюю страницу.Причина этого чуда в том, что я запускаю внешний сайт в новом окне, но не хочу, чтобы пользователь повторно отправлял скрытую форму, если обновит страницу.Плюс эта скрытая форма сдвинула страницу на несколько пикселей вниз, что действовало мне на нервы.

Мне были бы очень интересны любые более чистые идеи по этому поводу.

Эрик Сиппл

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

Я начал с этого примера КодПроект

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

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

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

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

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

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

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

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

Редактировать:Я упустил тот факт, что вы спрашиваете о внешний страница.Я думаю, для этого вам нужно, чтобы на вашей странице ASP.NET была создана HTML-форма, для действия которой установлен удаленный URL-адрес, а для метода — POST.(При использовании межстраничной публикации это может быть даже другая страница без пользовательского интерфейса, только со скрытыми элементами формы.) Затем добавьте немного 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top