Avatar billede mrpalermo Nybegynder
28. august 2007 - 15:16 Der er 6 kommentarer og
1 løsning

Håndtere SOAP response.

Jeg kalder en PHP Service via asp.net på følgende måde (Da jeg ikke kan få VS.Net til at benytte en PHP Service korrekt):

Dim xmlrequest As String = "<?xml version='1.0'?><SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='tns:CustomerServiceV1' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><SOAP-ENV:Body><ns1:createCustomer SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:ns1='http://etdomain.dk/ws/CRM'><firmalogin xsi:type='xsd:string'>firmalogin</firmalogin><firmanavn xsi:type='xsd:string'>firmanavn</firmanavn><adresse xsi:type='xsd:string'>adresse</adresse><postnr xsi:type='xsd:string'>postnr</postnr><bynavn xsi:type='xsd:string'>bynavn</bynavn><tlfnr xsi:type='xsd:string'>tlfnr</tlfnr><faxnr xsi:type='xsd:string'>faxnr</faxnr><email xsi:type='xsd:string'>email</email><websiteurl xsi:type='xsd:string'> websiteurl</websiteurl><sprog xsi:type='xsd:string'>sprog</sprog><land xsi:type='xsd:string'>land</land><gruppe xsi:type='xsd:string'>1</gruppe></ns1:createCustomer></SOAP-ENV:Body></SOAP-ENV:Envelope>"

                    Dim req As HttpWebRequest = CType(WebRequest.Create("http://test2.dmz.etdomain.dk/extern/ws/CRM/wsCustomer.php"), HttpWebRequest)
                    req.Method = "POST"
                    req.ContentType = "text/xml"
                    req.Credentials = New NetworkCredential("userid", "password")
                    Dim post As StreamWriter = New StreamWriter(req.GetRequestStream())
                    post.Write(xmlrequest)
                    post.Close()
                    Dim resp As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
                    Dim sr As StreamReader = New StreamReader(resp.GetResponseStream())
                    Dim xmlresponse As String = sr.ReadToEnd()


xmlresponse får efterfølgende tildelt værdien:

"<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://etdomaine.dk/ws/CRM" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:createCustomerResponse><returnvalue xsi:type="ns2:Map"><item><key xsi:type="xsd:string">text</key><value xsi:type="xsd:string">Parameter 11 (land) should be 2 letters</value></item><item><key xsi:type="xsd:string">code</key><value xsi:type="xsd:int">0</value></item></returnvalue></ns1:createCustomerResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
"

Jeg ved, at hvis jeg kunne kalde webservicen på en "normal" måde i VS 2005, ville jeg få et array retur, som indeholder en int og en text.

Det jeg i bund og grund ønsker at få ud, er værdierne "0" og "Parameter 11 (land) should be 2 letters".

Jeg har prøvet med noget .ReadXml(xmlresponse) uden held.
Er der nogen der kan hjælpe med den?
Avatar billede nielle Nybegynder
28. august 2007 - 22:30 #1
Man kan muligvis begynde at arbejde med SoapFormatter-klassen fra System.Runtime.Serialization.Formatters.Soap assemblien, men jeg kan ikke umiddelbart få det til at spille.

Alternativt kan du forsøge at parse teksten med regexp:

            string xmlresponse =
@"<?xml version=""1.0"" encoding=""UTF-8""?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ns1=""http://etdomaine.dk/ws/CRM"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:ns2=""http://xml.apache.org/xml-soap"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:SOAP-ENC=""http://schemas.xmlsoap.org/soap/encoding/"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/""><SOAP-ENV:Body><ns1:createCustomerResponse><returnvalue xsi:type=""ns2:Map""><item><key xsi:type=""xsd:string"">text</key><value xsi:type=""xsd:string"">Parameter 11 (land) should be 2 letters</value></item><item><key xsi:type=""xsd:string"">code</key><value xsi:type=""xsd:int"">0</value></item></returnvalue></ns1:createCustomerResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>";

            string text = "undefined";
            int code = -1;

            Regex textRe = new Regex(@"<item><key xsi:type=""xsd:string"">text</key><value xsi:type=""xsd:string"">(?<text>.*?)</value></item>");
            Match textReMatch = textRe.Match(xmlresponse);
            if (textReMatch.Success)
                text = textReMatch.Groups["text"].Value;

            Regex codeRe = new Regex(@"<item><key xsi:type=""xsd:string"">code</key><value xsi:type=""xsd:int"">(?<code>\d+)</value></item>");
            Match codeReMatch = codeRe.Match(xmlresponse);
            if (codeReMatch.Success)
                code = int.Parse(codeReMatch.Groups["code"].Value);

            Console.WriteLine(text);
            Console.WriteLine(code);
Avatar billede arne_v Ekspert
29. august 2007 - 03:18 #2
Man kan også udnytte at det faktisk er XML !

          string xmlresponse =
@"<?xml version=""1.0"" encoding=""UTF-8""?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ns1=""http://etdomaine.dk/ws/CRM"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:ns2=""http://xml.apache.org/xml-soap"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:SOAP-ENC=""http://schemas.xmlsoap.org/soap/encoding/"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">
<SOAP-ENV:Body>
<ns1:createCustomerResponse>
<returnvalue xsi:type=""ns2:Map"">
<item>
<key xsi:type=""xsd:string"">text</key>
<value xsi:type=""xsd:string"">Parameter 11 (land) should be 2 letters</value>
</item>
<item>
<key xsi:type=""xsd:string"">code</key>
<value xsi:type=""xsd:int"">0</value>
</item>
</returnvalue>
</ns1:createCustomerResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>";
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlresponse);
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
            nsmgr.AddNamespace("ns1", "http://etdomaine.dk/ws/CRM");
            string text = doc.SelectSingleNode("//SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:createCustomerResponse/returnvalue/item[key='text']/value", nsmgr).FirstChild.Value;
            int code = int.Parse(doc.SelectSingleNode("//SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:createCustomerResponse/returnvalue/item[key='code']/value", nsmgr).FirstChild.Value);
            Console.WriteLine(text);
            Console.WriteLine(code);
Avatar billede arne_v Ekspert
29. august 2007 - 03:19 #3
Iøvrigt tror jeg at det faktisk er meningen at der skal returneres Dictionary<string, object> !
Avatar billede mrpalermo Nybegynder
29. august 2007 - 10:27 #4
*Undskyld mit sprog...Fuck hvor er du sej, Arne.

Dit forslag virker perfekt.

Det kan godt være du har ret vedr. Dictionary<string, object>. Troede det var et array de returnerede.

Smid et svar...
Avatar billede arne_v Ekspert
30. august 2007 - 04:26 #5
Svar.

Regex løsningen virker vel også.

Et associativt array i PHP er det samme som Dictionary<> i C# (.NET 2.0 og nyere - i
.NET 1.x er det Hashtable)-
Avatar billede nielle Nybegynder
30. august 2007 - 06:47 #6
Det er fint nok med mig - spørgeren bestemmer altid 100 % hvordan point skal fordeles :^)
Avatar billede mrpalermo Nybegynder
30. august 2007 - 09:52 #7
Sorry Nielle...havde slet ikke set der lå et indlæg over arnes. Jeg gik helt pr. automatik bare ned i bunden. Det beklager jeg.

Du skal ikke snydes for point, så gå ind her: http://www.eksperten.dk/spm/794054
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester