none
Comment créer un formulaire HTML « personnalisé » ? RRS feed

  • Question

  • Bonjour.

    Ausein d'une application VB 2010 en ASP.NET, j'ai besoin de passer des paramètres via un formulaire HTML pour appeler un programme que je ne maîtrise pas. Les spécifications sont les suivantes :

    <HTML>
    <HEAD>
    </HEAD>
    <BODY onLoad="document.Login.submit();" >
     <FORM ACTION="http://xxx" METHOD="GET" NAME="Login">
      <INPUT TYPE="HIDDEN" name="LOGIN" value="yyy">
      <INPUT TYPE="HIDDEN" name="PWD" value="zzz">
     </FORM>
    </BODY>
    </HTML>
    

    Ce n'est peut-être pas très propre, mais c'est ainsi.

    Il faut que je puisse personnaliser xxx, yyy et zzz.

    J'ai essayé avec une page .aspx, mais je n'y arrive pas.

    J'ai essayé avec une page .asp, mais je reçois le message d'erreur suivant : « Le type de page demandé n'est pas pris en charge, car il a été explicitement interdit.  L'extension '.asp' n'est peut-être pas correcte. »

    Bref, je sèche. Quelqu'un pourrait-il m'aider ?

    Merci d'avance,

    Gilbert

    vendredi 8 avril 2011 12:18

Réponses

  • WebClient permet également d'envoyer en POST (avec UploadValues qui permet de fournir simplement les paires nom/valeur).

    Mais qu'attend exactement la page ? Le code de la page utilise également la méthode GET. Si c'est effectivement le cas, utiliser la méthode POST fonctionnera ou pas selon la façon dont les valeurs envoyées sont lues par la page (lecture des valeurs sans préciser et l'infrastructure va essayer de lire les différentes sources possibles ou en précisant explicitant auquel cas la page ne pourra pas lire les données envoyées via POST si elle lit explicitement les données envoyées via un GET).

    A moins que ce ne soit qu'un exemple et que la "vraie" page n'utilise pas la méthode GET ?

    Effectivement, c'est juste le serveur web de VS qui ne prends pas en charge les pages ASP. Mais encore une fois cela ne change pas grand chose (ASP ou ASP.NET il faudra envoyer une requête HTTP vers la page concernée).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 11 avril 2011 08:45
    Modérateur

Toutes les réponses

  • Bonjour,

    A priori il suffit d'utiliser System.Net.WebClient pour envoyer une requête HTTP à l'adresse concerné (donc http://xxx?LOGIN=xxx&PWD=zzz)

    Les pages ASP "anciennes" ne sont pas prises en charge par le serveur web de développement ASP.NET (mais elles le sont par IISExpress 7.5). Après cela ne change pas le problème, toutes les technos permettant d'envoyer une requête HTTP seront à égalité sur ce sujet.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Proposé comme réponse TroxsaEditor vendredi 8 avril 2011 18:44
    vendredi 8 avril 2011 15:58
    Modérateur
  • Bonjour Patrice.

    Response.Redirect(http://xxx?LOGIN=xxx&PWD=zzz) ? Cela ne me convient pas, car le mot de passe apparaîtra dans la barre d'adresse du navigateur. Je voudrais envoyer en method="post". En revanche, tu veux dire que si je testais directement avec mon serveur IIS 6 de test au lieu du serveur web de VS2010, la page .asp serait acceptée ? Je vais essayer dès demain.

    Bonne soirée,

    Gilbert

    dimanche 10 avril 2011 20:14
  • WebClient permet également d'envoyer en POST (avec UploadValues qui permet de fournir simplement les paires nom/valeur).

    Mais qu'attend exactement la page ? Le code de la page utilise également la méthode GET. Si c'est effectivement le cas, utiliser la méthode POST fonctionnera ou pas selon la façon dont les valeurs envoyées sont lues par la page (lecture des valeurs sans préciser et l'infrastructure va essayer de lire les différentes sources possibles ou en précisant explicitant auquel cas la page ne pourra pas lire les données envoyées via POST si elle lit explicitement les données envoyées via un GET).

    A moins que ce ne soit qu'un exemple et que la "vraie" page n'utilise pas la méthode GET ?

    Effectivement, c'est juste le serveur web de VS qui ne prends pas en charge les pages ASP. Mais encore une fois cela ne change pas grand chose (ASP ou ASP.NET il faudra envoyer une requête HTTP vers la page concernée).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 11 avril 2011 08:45
    Modérateur
  • Merci Patrice.

    Je confirme qu'il me faut utiliser la méthode POST. J'ai donc programmé selon ton conseil :

      Private Sub AppelNotilus(ByVal txtLogin As String, ByVal txtPassword As String)
        Dim UrlNotilus As String = GetNotilusUrl()
        Dim ClientWeb As New WebClient
        ClientWeb.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
    
        Dim myNameValueCollection As New NameValueCollection()
        myNameValueCollection.Add("LOGIN", txtLogin)
        myNameValueCollection.Add("PWD", txtPassword)
        Dim ResponseArray As Byte() = ClientWeb.UploadValues(UrlNotilus, "POST", myNameValueCollection)
      End Sub
    

    Maintenant, mon problème est que la réponse de la page appelée est fournie en valeur de retour de la méthode UploadValues. Alors que je voudrais que cette réponse soit plutôt affichée à l'écran, de sorte que l'utilisateur, qui se sera autentifié dans l'application Web extérieure, pourra l'utiliser. Comment faire ?

    Merci d'avance,

    Gilbert

    lundi 11 avril 2011 12:02
  • J'ai trouvé et testé ; ceci fonctionne.

    Voir l'article de Samer Abu Rabie (http://www.codeproject.com/KB/aspnet/ASP_NETRedirectAndPost.aspx). En bref :

      ''' <summary>
      ''' POST data and Redirect to the specified url using the specified page
      ''' </summary>
      ''' <param name="currentPage">The page which will be the referrer page.</param>
      ''' <param name="destinationUrl">The destination Url to which the post and redirection is occuring..</param>
      ''' <param name="data">The data should be posted.</param>
      ''' <remarks>D'après Samer Abu Rabie (<a href="http://www.codeproject.com/KB/aspnet/ASP_NETRedirectAndPost.aspx">http://www.codeproject.com/KB/aspnet/ASP_NETRedirectAndPost.aspx</a>)</remarks>
      Public Shared Sub RedirectAndPost(ByVal currentPage As Page _
        , ByVal destinationUrl As String _
        , ByVal data As NameValueCollection)
        ' Prepare the Posting form
        Dim StrForm As String = PreparePostForm(destinationUrl, data)
        ' Add a literal control the specified page holding 
        ' the Post Form, this is to submit the Posting form with the request.
        currentPage.Controls.Add(New LiteralControl(StrForm))
      End Sub
      ''' <summary>
      ''' This method prepares an Html form which holds all data
      ''' in hidden field in the addetion to form submitting script.
      ''' </summary>
      ''' <param name="destinationUrl">
      ''' The destination Url to which the post and redirection
      ''' will occur, the Url can be in the same App or ouside the App.
      ''' </param>
      ''' <param name="data">A collection of data that will be posted to the destination Url.</param>
      ''' <returns>Returns a string representation of the Posting form.</returns>
      ''' <remarks>D'après Samer Abu Rabie (<a href="http://www.codeproject.com/KB/aspnet/ASP_NETRedirectAndPost.aspx">http://www.codeproject.com/KB/aspnet/ASP_NETRedirectAndPost.aspx</a>)</remarks>
      Private Shared Function PreparePostForm(ByVal destinationUrl As String _
        , ByVal data As NameValueCollection) As String
        ' Set a name for the form
        Dim StrFormID As String = "Login"
        ' Build the form using the specified data to be posted.
        Dim StrForm As StringBuilder = New StringBuilder()
        StrForm.Append("<form id=""" _
          & StrFormID _
          & """ name=""" _
          & StrFormID _
          & """ action=""" _
          & destinationUrl _
          & """ method=""post"">")
        For Each Cle As String In data
          StrForm.Append("<input type=""hidden"" name=""" & Cle & """ value=""" & data(Cle) + """ />")
        Next
        StrForm.Append("</form>")
        ' Build the JavaScript which will do the Posting operation.
        Dim StrScript As StringBuilder = New StringBuilder()
        StrScript.Append("<script language='javascript'>")
        StrScript.Append("var v" & StrFormID & " = document." & StrFormID + ";")
        StrScript.Append("v" & StrFormID & ".submit();")
        StrScript.Append("</script>")
        ' Return the form and the script concatenated. (The order is important, Form then JavaScript)
        Return StrForm.ToString() & StrScript.ToString()
      End Function
    
    

    Le résultat ne satisfera sans doute pas les puristes, car ce programme ajoute du code html et javascript après la balise </html>. Si quelqu'un a une idée d'amélioration de ce côté...

    Gilbert

     

    lundi 11 avril 2011 14:56
  • Au final j'ai l'impression que l'on voulait juste poster des valeurs vers une page que l'on ne contrôle pas depuis une page que l'on contrôle ?

    Dans ce cas, il suffirait de mettre les balises indiquées dans le message d'originie dans la page ASPX comme pour créer n'importe quelle autre page ASPX que l'on contrôle.

    J'iamgine que le problème d'origine est que pour tester cette solution tu as peut-être essayé de poster vers une page sur ton propre serveur en ASP (ce qui est peut-être la techno utilisée par la "vraie" page destinataire) ce qui ne fonctionne pas le serveur de développement intégré à VS ne prenant en charge que les pages ASPX.

    Cela aurait fonctionner avec une page ASP de test sous IIS ou avec la vraie page de destination.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

     

    lundi 11 avril 2011 15:22
    Modérateur