IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Récupérer un pdf généré à la volée


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 195
    Par défaut [C#] Récupérer un pdf généré à la volée
    Bonjour,

    Je me casse la tête depuis quelques heures là dessus et je ne trouve pas de solution.
    J'utilise un contrôle webbrowser pour crawler un site web qui requiert une double authentification : une boîte de dialogue système (htaccess probablement) et ensuite un formulaire web.
    A un moment je dois enregistrer un pdf qui est généré par le site. Je n'ai donc pas d'url directe vers le document, juste une url "classique" vers une jsp.
    J'ai exploré la piste évidente du webclient. Le problème étant que le WebClient n'étant pas authentifié via le formulaire web, au lieu de me récupérer le pdf, il me récupère la page qui est affichée lorsque l'on essaye d'appeler l'url sans s'être authentifié via le formulaire. Les credentials passent l'authentification https mais c'est tout.
    Ensuite j'ai essayé d'utiliser les propriétés Document et DocumentStream de mon contrôle WebBrowser dans le gestionnaire d'évènement DocumentCompleted, mais sans succès. En effet si j'appelle la fonction Navigate() sur l'url du pdf, c'est Adobe Reader qui se lance, et par conséquent le document pdf n'est pas chargé dans la propriété Document (dans celle-ci se trouve en fait la page précédente).
    J'essaye d'explorer la piste de simuler un clic droit>enregistrer sous mais sans grand succès.

    Quelqu'un a-t-il une idée ?

    Merci beaucoup !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Gunny Voir le message
    Le problème étant que le WebClient n'étant pas authentifié via le formulaire web, au lieu de me récupérer le pdf, il me récupère la page qui est affichée lorsque l'on essaye d'appeler l'url sans s'être authentifié via le formulaire. Les credentials passent l'authentification https mais c'est tout.
    Le problème est que de base, WebClient ne sait pas gérer les cookies. Donc l'authentification par formulaire que tu fais est aussitôt "oubliée", vu que tu ne retransmets pas les cookies que tu as reçus en t'authentifiant.

    Heureusement c'est assez facile d'ajouter cette fonctionnalité :

    - Crée une classe qui hérite de WebClient (appelle la par exemple WebClientEx)
    - Ajoute une propriété CookieContainer (de type CookieContainer)
    - Override la méthode GetWebRequest pour gérer les cookies de la HttpWebRequest


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class WebClientEx : WebClient
    {
        public CookieContainer CookieContainer { get; set; }
     
        protected override WebRequest GetWebRequest(Uri address)
        {
            var req = base.GetWebRequest(address);
            var httpReq = req as HttpWebRequest;
            if (httpReq != null)
            {
                httpReq.CookieContainer = this.CookieContainer;
            }
            return req;
        }
    }

    Pour l'utiliser, initialise la propriété CookieContainer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var client = new WebClientEx();
    client.CookieContainer = new CookieContainer();
    ...
    Si tu réutilises le même WebClientEx pour plusieurs requêtes successives (ou que tu réutilises le même CookieContainer avec plusieurs WebClientEx), les cookies seront conservés entre chaque requête, et ça devrait fonctionner comme tu veux

  3. #3
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 195
    Par défaut
    Merci !

    J'ai donc écrit ce code (je vous passe les appels à mon fichier config) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    WebClientEx client = new WebClientEx();
    client.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
    client.Credentials = new NetworkCredential(login, pass);
    client.CookieContainer = new CookieContainer();
     
    //Authentification formulaire
    string url = "urlForm";
    NameValueCollection formData = new NameValueCollection();
    formData["txtLogin"] = login2;
    formData["txtMdp"] = pass2;
     
    byte[] responseBytes = client.UploadValues(url, "POST", formData);
     
     
    // On enregistre temporairement le PDF
    string tempPath = Path.GetTempFileName() + ".pdf";
    client.DownloadFile("URLpdf", tempPath);
    Et... ça ne fonctionne pas, mon code reste bloqué lors de l'appel à UploadValues (erreur 401). D'où cela peut-il venir ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Gunny Voir le message
    Et... ça ne fonctionne pas, mon code reste bloqué lors de l'appel à UploadValues. D'où cela peut-il venir ?
    Bizarre... et si tu vires le CookieContainer ça bloque pas ?

  5. #5
    Membre éprouvé Avatar de Gunny
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Danemark

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 195
    Par défaut
    Ca ne change rien non, toujours erreur 401. Pourtant mes credentials sont corrects.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bizarre... sans le CookieContainer ça doit pourtant revenir au même qu'avec un WebClient normal

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/07/2012, 18h26
  2. Réponses: 3
    Dernier message: 19/05/2006, 17h08
  3. [MySQL] Récupérer Code HTML généré par PHP
    Par @ngelofdeath dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/04/2006, 21h51
  4. [Système] récupérer l'HTML généré par ma page PHP
    Par saint-pere dans le forum Langage
    Réponses: 2
    Dernier message: 27/09/2005, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo