2008-08-07 16 views
26

ASP.NET controles del lado del servidor devolución de datos a su propia página. Esto hace que los casos en los que desee redirigir a un usuario a una página externa, pero que es necesario enviarlos a esa página por alguna razón (para autenticación, por ejemplo) sean un problema.¿Cómo puedo publicar y luego redireccionar a una URL externa de ASP.Net?

Un HttpWebRequest funciona muy bien si no quiere volver a dirigir, y JavaScript está muy bien en algunos casos, pero puede ser complicado si usted realmente no necesita el código del lado del servidor para obtener los datos juntos para el puesto.

¿Cómo publican ambos en una URL externa y redirigen al usuario al resultado de su código ASP.NET de código subyacente?

Respuesta

9

He resuelto este problema hoy. Empecé desde this article en C# Corner, pero encontré el ejemplo, aunque técnicamente correcto, un poco incompleto. Todo lo que dijo era correcto, pero tenía que visitar algunos sitios externos para armar esto y trabajar exactamente como yo quería.

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

Esta solución implica el uso de HttpContext.Current.Response.Write() para escribir los datos para el formulario, a continuación, utilizando un poco de Javascript en el método

<body onload=""> 

para enviar el formulario a la dirección URL correcta.

Cuando el usuario hace clic en el enlace Centro de soporte, el siguiente método se llama a 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 que poco onload del Javascript, que, cuando se carga el cuerpo de la página, envía el formulario y luego redirige al usuario a mi página de inicio. La razón de ese poco de hoodoo es que estoy lanzando 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 pocos píxeles, lo que me molestó.

Estaría muy interesado en cualquier idea más limpia que alguien tenga sobre esta.

Eric Sipple

1

Si está utilizando ASP.NET 2.0, puede hacerlo con cross-page posting.

Editar: Extraño el hecho de que está preguntando por una página externa. Para eso, creo que necesitaría tener su página ASP.NET generada en un formulario HTML cuya acción está configurada en la URL remota y el método está establecido en POST. (Con la publicación de páginas cruzadas, esta podría ser una página diferente sin UI, 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.

1

he hecho esto se genera un formulario que se auto-mensajes (usando JavaScript) a la URL remoto deseado - se reúnen toda la información que necesita para el puesto de devolución de datos del formulario web y luego construir el HTML de forma remota la colocación de anuncios y devolverlo 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 de páginas cruzadas funcionará si posee ambas páginas, pero no si necesita publicar en otro sitio (PayPal, por ejemplo).

2

lo haría la forma de correos en su código detrás de la utilización HttpWebRequest clase. Aquí es una buena clase de ayuda para obtener su comenzado:

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

A partir de ahí, sólo puede hacer un Response.Redirect, o tal vez tenga que variar su acción en función del resultado del poste (si hay fue un error, se lo muestra al usuario o lo que sea). Creo que ya tienes la respuesta en tu pregunta para ser sincero: parece que piensas que es una publicación O redirigir cuando en realidad puedes hacer ambas cosas desde tu código.

4

Empecé con este ejemplo de CodeProject

Entonces, en lugar de añadir a la página, me prestó saalon (arriba) e hicieron un Response.Write().

1

que necesitaba para abrir en la misma ventana, frente a los posibles problemas de frame de la página original, a continuación, volver a dirigir a un sitio externo en el código detrás:

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 
Cuestiones relacionadas