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 :

HttpWebResponse : Erreur 401 ou 505 - Credential & HTTPS - Probleme


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut HttpWebResponse : Erreur 401 ou 505 - Credential & HTTPS - Probleme
    Bonjour,

    Voila 2 journées entières que je galère sur ce truc !

    La situation est très simple à comprendre :

    Je dois communiquer avec un CALL MANAGER Cisco 6.0 en AXL SOAP.

    Je suis en C# (.NET 3.5), et j'en profite donc pour utiliser les classes qui me semble les plus appropriées pour ce genre de chose : HttpWebRequest & HttpWebResponse.
    (Contrairement à Java 1.5, ou j'utilisais les socket SSL).

    En gros, la requête que je dois envoyer contient une en-tête + une partie XML avec les balises qui seront interprétables par le CCM.

    Voici un exemple de requête qui fonctionne (en java !) :

    POST /axl/ HTTP/1.0
    Authorization: Basic Q0MMQHTtqW5pc5RyYVRzzjpuczStMDM5OQ==
    Content-type: text/xml
    Content-length: 435

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlnssi="http://www.w3.org/2000/10/XMLSchema-instance" xmlnssd="http://www.w3.org/1999/XMLSchema">
    <SOAP-ENV:Body>
    <axl:getUser xmlns:axl="http://www.cisco.com/AXL/1.0" xsi:schemaLocation="http://www.cisco.com/AXL/1.0 http://ccmserver/schema/axlsoap.xsd" sequence="1234"> <userid>cdupont</userid></axl:getUser> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
    Maintenant, voici le code que j'emploie (et j'en ai même essayé 10 milles différents, pour être certain que cela ne venait pas du miens!) :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatesPolicy(); //Classe pour forcer l'autorisation des certificats.
                
                HttpWebResponse HttpWResponse = null;
                StreamReader sr = null;
                              
                    HttpWebRequest HttpWRequest = (HttpWebRequest)WebRequest.Create("https://10.8.17.99:8443/axl"); 
    
                    HttpWRequest.KeepAlive = true;
                    HttpWRequest.ContentType = "text/xml";     
                    HttpWRequest.Method = "POST";
                    HttpWRequest.Credentials = new NetworkCredential("monlogin", "motdepasse");
                    HttpWRequest.ProtocolVersion = new Version(1,0);
                    
    
                    System.Text.Encoding asciiEncoding = Encoding.UTF8;                
                    byte[] byteArray = new byte[asciiEncoding.GetByteCount("monlogin" + ":" + "motdepasse")];
                    byteArray = asciiEncoding.GetBytes("monlogin" + ":" + "motdepasse");
                    HttpWRequest.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(byteArray));
    
                    byte[] byteReq = asciiEncoding.GetBytes(Requete);
                    HttpWRequest.ContentLength = byteReq.Length;
                    Stream stream = HttpWRequest.GetRequestStream();
                    stream.Write(byteReq, 0, byteReq.Length);
                    stream.Flush();
                    stream.Close();
    
                    HttpWResponse = (HttpWebResponse)HttpWRequest.GetResponse();
                    sr = new StreamReader(HttpWResponse.GetResponseStream());
                    String ret = sr.ReadToEnd();
                    return ret;
    Vous remarquerez les lignes en GRAS et colorées.

    La premiere, en vert, permet d'accepter les CERTIFICATS et de forcer cette autorisation.
    Elle me permet d'éviter l'erreur lancée "NEED HTTPS SSL socket ...".

    En effet, pour pouvoir accéder à mon URL du CallManager, et à la page que je contacte, c'est du SSL (HTTPS) !

    La deuxieme, en BLEU, m'a permis de forcer la version HTTP employée pour envoyer au CallManager.
    En effet, si je ne mets pas cette ligne, j'obtiens l'erreur suivante : The remote server returned an error: (505) Http Version Not Supported.

    Bref, c'est la dernière qui me préoccupe.

    Car le CREDENTIAL est CORRECT !!! (certain à 100% !!, ca fonctionne en JAVA !).

    Mais cependant, ça ne passe pas et j'ai toujours une erreur : The remote server returned an error: (401) Unauthorized.

    Je ne comprends pas, en Java avec Socket SSL tout fonctionne à merveille (en mode console du moins), et pas en .NET

    Quelqu'un aurait une idée ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut
    J'aimerais ajouter ceci :

    En mode DEBUG, je place un break point sur la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HttpWebResponse oWResponse = (HttpWebResponse)oWRequest.GetResponse();
    Lorsque l'exécution séquentielle arrive sur cette ligne (mais ne l'a pas encore exécutée), on observe que l'objet oWRequest possède son champ Credentials à une valeur avec un Username et un Mot de passe, qui sont correct.

    Lorsque je passe à la séquence suivante (F10), il exécute la ligne, et me déclenche l'erreur.
    A ce moment là, lorsque je regarde l'objet oWRequest, je peux voir que son champs Credentials est passé à NULL, alors que je ne l'ai pas changé !!!

    Pareil pour le champs Header, la partie "Authentication Basic : ..." n'est plus présente !

    Qu'en pensez-vous ?

  3. #3
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut
    J'ai trouvé la solution à tout mon problème.

    Je ne vais pas exposer tout mon code, car je ne suis pas certain que beaucoup de personne s'interessent à cela.

    Je vais donc expliquer la manière de résoudre le problème :

    1) Il faut utiliser un CACHE CREDENTIAL pour permettre de garder en mémoire le Crédential lors de l'envoi de données, pour éviter qu'il soit fixé à NULL juste après l'envoi ou la création du flux d'envoi.

    Une fois le cache établi, l'erreur 401 disparait.

    2) Pour l'erreur 505, il suffit de forcer la version HTTP à 1.0 :

    HttpWRequest.ProtocolVersion = System.Net.HttpVersion.Version10;

    Ensuite, la communication s'établi correctement.

    C'était pour la partie technique .NET.
    Concernant la partie Administrative AXL Layer de CISCO, je vous invite à parcourir le forum des développeurs CISCO (sur le site officiel, www.cisco.com) où j'y ai laissé ma solution pour les futures personnes qui développeront avec ce protocole.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut
    bonjour,

    et le même code qui fonctionne en vb.net ça donnerait quoi ??

    je suis débutant en prog et j'arrive pas a trouver mon bonheur nulle part

    merci si réponse !!


  5. #5
    Membre éclairé
    Étudiant
    Inscrit en
    Janvier 2004
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2004
    Messages : 279
    Par défaut
    Prends ma source en C#, transpose la pour VB.NET et ça fonctionnera.

    Personnelement, je hais le VB...

    Et puis, si tu connais les bases du VB, tu arriveras très vite à comprendre mon code et le passer en VB. Il n'est pas très difficile à comprendre.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut
    Merci pour ta réponse !!

    mais c'est pas gagné .... !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Par défaut
    Bonjour,

    Je déterre peut-être un vieux sujet mais je suis tombé dessus via mes recherches google...

    Je cherche à pouvoir redémarrer un service sur un CCM via un script.
    Au vu de mes recherches, les requêtes AXL et SOAP sont une bonnes pistes.

    Mais je ne vois pas comment faire cela...

    Quelqu'un a-t-il déjà fait cela? (pouvoir redémarrer un service sur un CCM via requête AXL?)


    Merci d'avance de votre réponse

  8. #8
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Je ne vois pas le rapport par rapport à la question originale.

    Et si tu veux avoir plus de réponses, il faut que tu crée un nouveau topic avec ta question clairement exposée.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. HTTPS + .htaccess = erreur 401
    Par fred32 dans le forum Apache
    Réponses: 9
    Dernier message: 20/09/2010, 13h01
  2. Traitement des erreurs 403/401 en réponse aux requetes HTTP
    Par Flodelarab dans le forum Développement
    Réponses: 2
    Dernier message: 03/12/2007, 03h43
  3. Erreur 401.2 sur serveur IIS 6.0
    Par Arthis dans le forum IIS
    Réponses: 0
    Dernier message: 27/07/2007, 10h20
  4. [Mail] ERREUR 401 petit souci
    Par depelek dans le forum Langage
    Réponses: 7
    Dernier message: 07/12/2006, 17h11
  5. Erreur 401 + IIS
    Par DiabloZizi dans le forum Autres Logiciels
    Réponses: 10
    Dernier message: 25/03/2006, 12h26

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