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

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

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

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

Ответы [ 6 ]

11 голосов
/ 07 августа 2008

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

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

Эрик Сиппл

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

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

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

3 голосов
/ 08 августа 2008

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

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

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

2 голосов
/ 27 августа 2013

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

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 голосов
/ 07 августа 2008

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

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

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

2 голосов
/ 07 августа 2008

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

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

...