Domanda

ASP.NET controlla il postback sul lato server alla propria pagina.Ciò rende difficili i casi in cui si desidera reindirizzare un utente a una pagina esterna, ma è necessario pubblicare su quella pagina per qualche motivo (ad esempio per l'autenticazione).

UN HttpWebRequest funziona benissimo se non vuoi reindirizzare e JavaScript va bene in alcuni casi, ma può diventare complicato se hai davvero bisogno del codice lato server per mettere insieme i dati per il post.

Quindi, come pubblicare su un URL esterno e reindirizzare l'utente al risultato dal codice codebehind ASP.NET?

È stato utile?

Soluzione

Ecco, oggi ho risolto questo problema.Ho iniziato da Questo articolo su C# Corner, ma ho trovato l'esempio, sebbene tecnicamente valido, un po' incompleto.Tutto ciò che ha detto era giusto, ma avevo bisogno di visitare alcuni siti esterni per mettere insieme il tutto in modo che funzionasse esattamente come volevo.

Non ha aiutato il fatto che l'utente tecnicamente non inviasse affatto un modulo;stavano facendo clic su un collegamento per accedere al nostro centro di supporto, ma per accedervi è stato necessario inviare un post http al sito del centro di supporto.

Questa soluzione prevede l'utilizzo di HttpContext.Current.Response.Write() per scrivere i dati per il modulo, quindi l'utilizzo di un po' di Javascript sul

<body onload=""> 

metodo per inviare il modulo all'URL corretto.

Quando l'utente fa clic sul collegamento Centro supporto, viene chiamato il seguente metodo per scrivere la risposta e reindirizzare l'utente:

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 chiave di questo metodo sta in quella parte onload di Javascript che, quando viene caricato il corpo della pagina, invia il modulo e quindi reindirizza l'utente alla mia home page.Il motivo di tutto questo è che sto lanciando il sito esterno in una nuova finestra, ma non voglio che l'utente invii nuovamente il modulo nascosto se aggiorna la pagina.Inoltre quella forma nascosta spingeva la pagina verso il basso di alcuni pixel, cosa che mi dava sui nervi.

Sarei molto interessato a qualsiasi idea più pulita che qualcuno abbia su questo.

Eric Sipple

Altri suggerimenti

Ho iniziato con questo esempio da CodiceProgetto

Quindi invece di aggiungere elementi alla pagina, ho preso in prestito da saalon (sopra) e ho eseguito un Response.Write().

Vorrei pubblicare il modulo nel codice dietro utilizzando la classe HttpWebRequest.Ecco un buon corso di supporto per iniziare:

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

Da lì, puoi semplicemente eseguire un Response.Redirect o forse devi variare la tua azione in base al risultato del post (se si è verificato un errore, mostrarlo all'utente o altro).Penso che tu abbia già avuto la risposta alla tua domanda a dire il vero: sembra che tu pensi che sia un post O un reindirizzamento quando in realtà puoi farli entrambi dal tuo codice dietro.

L'ho fatto eseguendo il rendering di un modulo che si pubblica automaticamente (utilizzando JavaScript) sull'URL remoto desiderato: raccogli tutte le informazioni necessarie per il post nel postback del modulo Web, quindi crea l'HTML per il modulo di pubblicazione remota e restituiscilo al cliente.

Ho creato una classe di utilità per questo che contiene l'URL remoto e una raccolta di coppie nome/valore per il modulo.

La pubblicazione su più pagine funzionerà se possiedi entrambe le pagine coinvolte, ma non se devi pubblicare su un altro sito (PayPal, ad esempio).

Se utilizzi ASP.NET 2.0, puoi farlo con pubblicazione su più pagine.

Modificare:Mi era sfuggito il fatto che mi stessi chiedendo di un esterno pagina.Per questo penso che dovresti avere la tua pagina ASP.NET generata un modulo HTML la cui azione è impostata sull'URL remoto e il metodo è impostato su POST.(Utilizzando la pubblicazione su più pagine, potrebbe anche trattarsi di una pagina diversa senza interfaccia utente, solo elementi del modulo nascosti.) Quindi aggiungi un po' di javascript per inviare il modulo non appena il risultato del postback è stato ricevuto sul client.

Dovevo aprire nella stessa finestra, occupandomi dei possibili problemi di frame dalla pagina originale, quindi reindirizzando a un sito esterno nel code-behind:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top