Avatar billede rasmuzzen Nybegynder
07. maj 2012 - 15:34 Der er 12 kommentarer og
1 løsning

Læse response fra et webservice kald.

Jeg har en webservice på en linux server. I denne service (SOAP envelope sendes til webservicen) er en query funktion, hvortil der sendes 2 argumenter. Alt dette er der funktioner til, fint, det virker.

Når jeg så udfører dette kald via referencen til funktionen i wsdl filen/servicen, kan jeg se via wireshark at serveren fint returnerer det ønskede, en masse id og tidsstempler i fin xml format.

Hvordan dælen fanger jeg dette response direkte i min C# kode.

Jeg vil helst ikke lave en programmeret "soap envelope", og sende det via WebRequest, selvom det vil kunne virke, det er der mange eksempler på, på nettet, kan se i andre indlæg her, at der står "gør det via wsdl, det er nemt", men det er kun nemt den ene vej syntes jeg at kunne se.
Avatar billede arne_v Ekspert
07. maj 2012 - 15:44 #1
Naar du kalder en metode i den stub der er genereret udfra WSDL faar du et objekt tilbage. Al den information du skal bruge boer vaere i dette objekt.

Er det ikke?
Avatar billede rasmuzzen Nybegynder
07. maj 2012 - 15:48 #2
Ved jeg ikke kan de se det ud af koden ?.

    VideoOutput videoOutput = new VideoOutput();
            SelectableString mySelectableString = new SelectableString();

            StreamQuery myStreamQuery = new StreamQuery();
            mySelectableString.Value = "uuid:3011eac0-5a42-458a-aa4b-97d91c41e6f9/urn:pelco-com:serviceId:VideoOutput-1";
            myStreamQuery.sourceURI = mySelectableString;

            mySelectableString = new SelectableString();
            mySelectableString.Value = "uuid:b90e4e9d-19b3-475a-b6c6-8ba6d197aa72/urn:pelco-com:serviceId:VideoOutput-1";
            myStreamQuery.outputURI = mySelectableString;

            mySelectableString = new SelectableString();
            mySelectableString.Value = "AllRecord";
            myStreamQuery.eventURN = mySelectableString;

            videoOutput.Url = @"http://10.11.90.72:49154/control/VideoOutput-1";
          int dummy1 = 0;
            bool dummy2 = false;
           
// her kaldes funktionen
videoOutput.Query(myStreamQuery, ref dummy1, ref dummy2);
Avatar billede arne_v Ekspert
07. maj 2012 - 16:34 #3
Er der "noget" i dummy1 eller dummy2 eller returnerer Query metoden noget (ikke void)?
Avatar billede rasmuzzen Nybegynder
07. maj 2012 - 16:43 #4
Dummy1 og 2 har intet at sige.

Jeg ser videre på det på nettet i aften.

Jeg tror jeg er ovre i noget :

mitEtEllerAmdetobjekt = videoOutput.Query(myStreamQuery, ref dummy1, ref dummy2);

Er det det du også mener.

Det er den dårligste dokumentation i verden der er til Pelco's webservices. Alle deres andre funktioner er dokumenteret med små stykker kode, men ikke deres webservices, og så er noget af det fyldt med fejl....
Avatar billede arne_v Ekspert
07. maj 2012 - 17:19 #5
Netop.

Naar du har tilfoejet en ref til WSDL boer du faktisk kunne finde den genererede C# kode til stub paa din PC (ellers generer manuelt!).

Saa kan du se hvilken type Query returner. Og hvilke properties den type har.

Hvis du kan laese WSDL kan du ogsaa se det der. Ligesom at dem der kan kinesisk kan laese det.

:-)
Avatar billede rasmuzzen Nybegynder
09. maj 2012 - 11:01 #6
For lige at vende tilbage til det at sende via en webservice og modtage det via httpresponse, er det noget du har set, virker det ikke ulogisk, da man som regel sender og modtager i samme "session". Du plejer at kunne gennemskue hvad jeg mener. Jeg har ikke fundet nogen eksempler, der gør det på den måde.

Jeg var også så langt henne at jeg hat fået lavet et SOAP/XML dokument fodret med de rigtige værdier, det vil sikkert virke hvis jeg går videre med det, men som du skrev for år tilbage til en anden bruger, brug WSDL, det er meget nemmere. Det er det også her når bare man lige finder metoden. Er ikke vant til at kombibere wireshark analyse med mine programmeringsopgaver. Men det ligger firmaet Pelco meget op til i deres hjælp til os API programmører. Men som sagt så dokumenterer det det ikke ordentligt.

Retur variablen fandt jeg imens vi skrev sammen i mandags.
Avatar billede arne_v Ekspert
10. maj 2012 - 01:32 #7
Hvis du har fundet retur objektet saa burde det vaere nemt at se hvordan du henter ud af det.
Avatar billede arne_v Ekspert
10. maj 2012 - 01:34 #8
Men det kan naturligvios godt lade sig goere at hente et SOAP respons med HttpWebRequest, laese XMl ind i et XmlDocument og saa parse det.

Jeg tror endda at jeg har et eksempel paa hylden.

Men det er kun noget man bruger i absolutte noedstilfaelde.
Avatar billede rasmuzzen Nybegynder
22. maj 2012 - 08:26 #9
Forum larmer, skal vi lukke ned arne ?.

Hvis du som lukke svar kunne finde det der eksempel på hylden så smid det lige med. Hvis du ikke kan finde det er det også ok.
Avatar billede arne_v Ekspert
22. maj 2012 - 14:41 #10
Eksempel paa parsning af SOAP XML:


using System;
using System.Xml;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
          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
22. maj 2012 - 14:41 #11
og et svar
Avatar billede rasmuzzen Nybegynder
22. maj 2012 - 17:42 #12
Tak, ser lidt mast ud, skal vist lige folde den ud for overblikket.
Avatar billede arne_v Ekspert
22. maj 2012 - 18:26 #13
Koden er lidt kompakt og E's link forkorter goer det ikke bedre.

Det sidste kan fixes ved at hente den herfra:
  http://www.vajhoej.dk/arne/eksperten/div_2007_09/parsesoap.cs
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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