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

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

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

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

7.08.2008 19:13:04
6 ОТВЕТОВ

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

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

2
7.08.2008 19:30:01

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

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

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

2
7.08.2008 19:20:48
РЕШЕНИЕ

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

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

Эрик Сиппл

13
12.06.2019 14:02:02

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

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

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

4
8.08.2008 03:25:07

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

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

6
10.08.2014 14:08:42

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

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
2
27.08.2013 18:55:28