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.