Frage

ASP.NET steuert serverseitig das Postback auf die eigene Seite.Dies erschwert Fälle, in denen Sie einen Benutzer auf eine externe Seite umleiten möchten, aber aus irgendeinem Grund (z. B. zur Authentifizierung) auf dieser Seite posten müssen.

Ein HttpWebRequest Funktioniert hervorragend, wenn Sie keine Weiterleitung wünschen, und JavaScript ist in manchen Fällen in Ordnung, kann jedoch schwierig werden, wenn Sie wirklich den serverseitigen Code benötigen, um die Daten für den Beitrag zusammenzustellen.

Wie können Sie also sowohl auf einer externen URL posten als auch den Benutzer zum Ergebnis Ihres ASP.NET-CodeBehind-Codes weiterleiten?

War es hilfreich?

Lösung

Hier ist, dass ich dieses Problem heute gelöst habe.Ich habe angefangen von Dieser Artikel auf C# Corner, fand das Beispiel aber – obwohl technisch einwandfrei – etwas unvollständig.Alles, was er sagte, war richtig, aber ich musste ein paar externe Websites besuchen, um das zusammenzusetzen, damit es genau so funktionierte, wie ich es wollte.

Es hat nicht geholfen, dass der Benutzer technisch gesehen überhaupt kein Formular abgeschickt hat;Sie klickten auf einen Link, um zu unserem Support-Center zu gelangen, aber um sie anzumelden, musste ein http-Beitrag auf der Website des Support-Centers erstellt werden.

Diese Lösung beinhaltet die Verwendung von HttpContext.Current.Response.Write() zum Schreiben der Daten für das Formular und die anschließende Verwendung von etwas Javascript für das Formular

<body onload=""> 

Methode, um das Formular an die richtige URL zu senden.

Wenn der Benutzer auf den Support-Center-Link klickt, wird die folgende Methode aufgerufen, um die Antwort zu schreiben und den Benutzer umzuleiten:

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

Der Schlüssel zu dieser Methode liegt in diesem Onload-Bit von Javascript, das beim Laden des Hauptteils der Seite das Formular sendet und den Benutzer dann zurück auf meine eigene Homepage umleitet.Der Grund für diesen kleinen Blödsinn ist, dass ich die externe Website in einem neuen Fenster öffne, aber nicht möchte, dass der Benutzer das ausgeblendete Formular erneut sendet, wenn er die Seite aktualisiert.Außerdem verschob dieses versteckte Formular die Seite um ein paar Pixel nach unten, was mir auf die Nerven ging.

Ich wäre sehr an saubereren Ideen interessiert, die jemand zu diesem Thema hat.

Eric Sipple

Andere Tipps

Ich habe mit diesem Beispiel von begonnen CodeProjekt

Anstatt der Seite etwas hinzuzufügen, habe ich mir dann etwas von Saalon (oben) geliehen und einen Response.Write() ausgeführt.

Ich würde den Formularbeitrag in Ihrem Code hinter der HttpWebRequest-Klasse erstellen.Hier ist eine gute Hilfsklasse für den Einstieg:

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

Von dort aus können Sie einfach „Response.Redirect“ ausführen oder Ihre Aktion basierend auf dem Ergebnis des Beitrags variieren (wenn ein Fehler aufgetreten ist, zeigen Sie ihn dem Benutzer an oder was auch immer).Ich denke, um ehrlich zu sein, dass Sie die Antwort bereits in Ihrer Frage hatten – es hört sich so an, als ob Sie denken, dass es sich um einen Beitrag ODER eine Weiterleitung handelt, obwohl Sie in Wirklichkeit beides von Ihrem Code dahinter aus tun können.

Ich habe dies erreicht, indem ich ein Formular gerendert habe, das automatisch Beiträge (mit JavaScript) an die gewünschte Remote-URL sendet. Sammeln Sie alle Informationen, die Sie für den Beitrag benötigen, im Postback des Webformulars, erstellen Sie dann den HTML-Code für das Remote-Posting-Formular und rendern Sie ihn zurück an den Client.

Ich habe hierfür eine Utility-Klasse erstellt, die die Remote-URL und eine Sammlung von Name/Wert-Paaren für das Formular enthält.

Das seitenübergreifende Posten funktioniert, wenn Sie beide beteiligten Seiten besitzen, nicht jedoch, wenn Sie auf einer anderen Website (z. B. PayPal) posten müssen.

Wenn Sie ASP.NET 2.0 verwenden, können Sie dies mit tun seitenübergreifendes Posten.

Bearbeiten:Ich habe die Tatsache übersehen, dass Sie nach einem fragen extern Seite.Ich denke, dafür müsste Ihre ASP.NET-Seite ein HTML-Formular erstellen, dessen Aktion auf die Remote-URL und Methode auf POST festgelegt ist.(Beim seitenübergreifenden Posten könnte es sich sogar um eine andere Seite ohne Benutzeroberfläche und nur mit ausgeblendeten Formularelementen handeln.) Fügen Sie dann etwas Javascript hinzu, um das Formular abzuschicken, sobald das Postback-Ergebnis auf dem Client eingegangen ist.

Ich musste im selben Fenster öffnen, mögliche Frame-Probleme auf der Originalseite beheben und dann im Code dahinter auf eine externe Website umleiten:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top