Pregunta

El lado del servidor ASP.NET controla la devolución de datos a su propia página.Esto hace que los casos en los que desea redirigir a un usuario a una página externa, pero necesita publicar en esa página por algún motivo (para autenticación, por ejemplo), sean una molestia.

Un HttpWebRequest funciona muy bien si no quieres redirigir, y JavaScript está bien en algunos casos, pero puede resultar complicado si realmente necesitas el código del lado del servidor para reunir los datos para la publicación.

Entonces, ¿cómo se puede publicar en una URL externa y redirigir al usuario al resultado del código subyacente de ASP.NET?

¿Fue útil?

Solución

Aquí resolví este problema hoy.empecé desde Este artículo en C# Corner, pero encontré el ejemplo, aunque técnicamente sólido, un poco incompleto.Todo lo que dijo era correcto, pero necesitaba visitar algunos sitios externos para reconstruir esto y que funcionara exactamente como quería.

No ayudó que técnicamente el usuario no estuviera enviando ningún formulario;estaban haciendo clic en un enlace para ir a nuestro centro de soporte, pero para iniciar sesión se debía realizar una publicación http en el sitio del centro de soporte.

Esta solución implica usar HttpContext.Current.Response.Write() para escribir los datos del formulario y luego usar un poco de Javascript en el

<body onload=""> 

método para enviar el formulario a la URL adecuada.

Cuando el usuario hace clic en el enlace del Centro de soporte, se llama al siguiente método para escribir la respuesta y redirigir al usuario:

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>");
}

La clave de este método está en ese bit de carga de Javascript que, cuando se carga el cuerpo de la página, envía el formulario y luego redirige al usuario a mi propia página de inicio.La razón de este poco de vudú es que estoy iniciando el sitio externo en una nueva ventana, pero no quiero que el usuario vuelva a enviar el formulario oculto si actualiza la página.Además, esa forma oculta empujó la página hacia abajo unos cuantos píxeles, lo que me puso de los nervios.

Me interesaría mucho cualquier idea más clara que alguien tenga sobre este caso.

Eric Sipple

Otros consejos

Empecé con este ejemplo de Proyecto de código

Luego, en lugar de agregar a la página, tomé prestado de saalon (arriba) e hice Response.Write().

Haría la publicación del formulario en su código detrás usando la clase HttpWebRequest.Aquí hay una buena clase de ayuda para comenzar:

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

A partir de ahí, puedes simplemente hacer un Response.Redirect, o tal vez necesites variar tu acción según el resultado de la publicación (si hubo un error, mostrárselo al usuario o lo que sea).Para ser honesto, creo que ya tenías la respuesta a tu pregunta: parece que crees que es una publicación O una redirección cuando en realidad puedes hacer ambas cosas desde tu código.

Lo he hecho presentando un formulario que se publica automáticamente (usando JavaScript) en la URL remota deseada: recopile toda la información que necesita para la publicación en la devolución de datos del formulario web y luego cree el HTML para el formulario de publicación remota y vuelva a renderizarlo. al cliente.

Creé una clase de utilidad para esto que contiene la URL remota y una colección de pares de nombre/valor para el formulario.

La publicación entre páginas funcionará si eres propietario de ambas páginas involucradas, pero no si necesitas publicar en otro sitio (PayPal, por ejemplo).

Si está utilizando ASP.NET 2.0, puede hacer esto con publicación entre páginas.

Editar:Me perdí el hecho de que estás preguntando sobre un externo página.Para eso, creo que necesitaría que su página ASP.NET genere un formulario HTML cuya acción esté configurada en la URL remota y el método esté configurado en POST.(Al usar la publicación entre páginas, esta podría incluso ser una página diferente sin interfaz de usuario, solo elementos de formulario ocultos). Luego agregue un poco de javascript para enviar el formulario tan pronto como se reciba el resultado de la devolución en el cliente.

Necesitaba abrir en la misma ventana, solucionar posibles problemas de marco de la página original y luego redirigir a un sitio externo en el código subyacente:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top