Question

Le côté serveur ASP.NET contrôle la publication sur sa propre page.Cela rend les cas où vous souhaitez rediriger un utilisateur vers une page externe, mais devez publier sur cette page pour une raison quelconque (pour l'authentification, par exemple) une douleur.

Un HttpWebRequest fonctionne très bien si vous ne souhaitez pas rediriger, et JavaScript convient dans certains cas, mais peut devenir délicat si vous avez vraiment besoin du code côté serveur pour rassembler les données pour la publication.

Alors, comment publier sur une URL externe et rediriger l'utilisateur vers le résultat de votre code code-behind ASP.NET ?

Était-ce utile?

La solution

Voilà, j'ai résolu ce problème aujourd'hui.J'ai commencé à partir de Cet article sur C# Corner, mais j'ai trouvé l'exemple - bien que techniquement solide - un peu incomplet.Tout ce qu'il disait était vrai, mais j'avais besoin de consulter quelques sites externes pour que tout cela fonctionne exactement comme je le voulais.

Le fait que l'utilisateur ne soumettait pas du tout de formulaire n'aidait pas ;ils cliquaient sur un lien pour accéder à notre centre d'assistance, mais pour les connecter, une publication http devait être effectuée sur le site du centre d'assistance.

Cette solution implique d'utiliser HttpContext.Current.Response.Write() pour écrire les données du formulaire, puis d'utiliser un peu de Javascript sur le

<body onload=""> 

méthode pour soumettre le formulaire à l’URL appropriée.

Lorsque l'utilisateur clique sur le lien Support Center, la méthode suivante est appelée pour rédiger la réponse et rediriger l'utilisateur :

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 clé de cette méthode réside dans le bit de Javascript onload qui, lorsque le corps de la page est chargé, soumet le formulaire, puis redirige l'utilisateur vers ma propre page d'accueil.La raison de ce petit hoodoo est que je lance le site externe dans une nouvelle fenêtre, mais je ne veux pas que l'utilisateur soumette à nouveau le formulaire masqué s'il actualise la page.De plus, cette forme cachée a poussé la page vers le bas de quelques pixels, ce qui m'a énervé.

Je serais très intéressé par toutes les idées plus propres que quiconque aurait sur celui-ci.

Eric Sipple

Autres conseils

J'ai commencé avec cet exemple de CodeProjet

Ensuite, au lieu d'ajouter à la page, j'ai emprunté à saalon (ci-dessus) et j'ai fait un Response.Write().

Je ferais la publication du formulaire dans votre code en utilisant la classe HttpWebRequest.Voici une bonne classe d'aide pour commencer :

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

À partir de là, vous pouvez simplement effectuer une Response.Redirect, ou peut-être devez-vous modifier votre action en fonction du résultat de la publication (s'il y a eu une erreur, affichez-la à l'utilisateur ou autre).Je pense que vous avez déjà eu la réponse dans votre question pour être honnête - on dirait que vous pensez qu'il s'agit d'une publication OU d'une redirection alors qu'en réalité vous pouvez les faire tous les deux à partir de votre code derrière.

J'ai fait cela en rendant un formulaire qui publie automatiquement (à l'aide de JavaScript) sur l'URL distante souhaitée - rassemblez toutes les informations dont vous avez besoin pour la publication dans la publication du formulaire Web, puis créez le code HTML pour le formulaire de publication à distance et restituez-le. au client.

J'ai construit pour cela une classe utilitaire qui contient l'URL distante et une collection de paires nom/valeur pour le formulaire.

La publication sur plusieurs pages fonctionnera si vous possédez les deux pages concernées, mais pas si vous devez publier sur un autre site (PayPal, par exemple).

Si vous utilisez ASP.NET 2.0, vous pouvez le faire avec publication sur plusieurs pages.

Modifier:J'ai raté le fait que vous parlez d'un externe page.Pour cela, je pense que vous auriez besoin que votre page ASP.NET génère un formulaire HTML dont l'action est définie sur l'URL distante et la méthode est définie sur POST.(En utilisant la publication sur plusieurs pages, il pourrait même s'agir d'une page différente sans interface utilisateur, uniquement des éléments de formulaire masqués.) Ajoutez ensuite un peu de javascript pour soumettre le formulaire dès que le résultat de la publication a été reçu sur le client.

Je devais ouvrir dans la même fenêtre, traiter les éventuels problèmes de frame de la page d'origine, puis rediriger vers un site externe dans le code derrière :

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top