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 !) :
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!) :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" xmlns
sd="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>
Vous remarquerez les lignes en GRAS et colorées.
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;
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.
Partager