RDW Transactionele Services AFS SOAP services en .NET Het gebruik van een Service Reference binnen Visual Studio werkt niet vanwege incompatibiliteit met de gegenereerde WSDL binnen onze server. Hierdoor worden we geforceerd om de Web Reference optie te gebruiken. Dit is een probleem met het gebruik van array’s met objecten. Een gangbare oplossing is de volgende: Omgaan met PHP array parameter / result set in AFS Maak een Item klasse binnen je project met twee properties (key, value). Vanzelfsprekend kan de naam “item” variëren, maar deze komt veelvuldig voor in AFS. Voorbeeld code: public class Item { public string key { get; set; } public string value { get; set; } } Voeg het onderstaande attribuut toe aan de gegenereerde service klasse (Reference.cs). [SoapInclude(typeof(Item))] Houd er wel rekening mee dat je na elk update van de reference deze attribuut opnieuw moet toevoegen. Cartalk Data Services Cartalk SOAP services en .NET Bovenstaande oplossing zal niet i.c.m. Cartalk SOAP transacties werken omdat het resultaat van Cartalk complexer is en niet compatible is met .NET. Het resultaat in Cartalk is afhankelijk van de definitie van een query. Een pragmatische aanpak is het zelf verwerken van de response. Hieronder worden 2 oplossingen voorgesteld: Onderscheppen van de SOAP bericht Het gaat hierbij vooral om het overschrijven van de deserializatie proces, zodat je zelf de SOAP response kan parsen naar objecten. Dit kan m.b.v. SoapExtention class: ( http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension.aspx ). De onderstaande URL bevat een voorbeeld hiervoor. http://www.codeproject.com/Articles/445007/Intercept-a-raw-SOAP-message Zelf de transactie uitvoeren en ontleden Voorbeeld code (vervang XXXXX met de echte waardes) : public class CartalkResponse { public string resultaatCode { get; set; } public string resultaatOmschrijving { get; set; } public string server { get; set; } public List<CartalkResponseItem> resultaat { get; set; } public CartalkResponse() { this.resultaat = new List<CartalkResponseItem>(); this.resultaat.Add(new CartalkResponseItem()); } } public class CartalkResponseItem { public string kenteken { get; set; } public List<CartalkResponseItem> item { get; set; } public CartalkResponseItem() { this.item = new List<CartalkResponseItem>(); } } public static void CallWebService() { var _url = "https://voertuiginfo.cartalk.nl/1.0/Soap/Cartalk/"; var _action = "transaction"; XmlDocument soapEnvelopeXml = CreateSoapEnvelope(); HttpWebRequest webRequest = CreateWebRequest(_url, _action); InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest); // begin async call to web request. IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); asyncResult.AsyncWaitHandle.WaitOne(); WebResponse webResponse = webRequest.EndGetResponse(asyncResult); XmlTextReader reader = new XmlTextReader(webResponse.GetResponseStream()); CartalkResponse result = new CartalkResponse(); //Start reading reader.ReadToFollowing("resultaatCode"); reader.Read(); result.resultaatCode = reader.Value; reader.ReadToFollowing("resultaatOmschrijving"); reader.Read(); result.resultaatOmschrijving = reader.Value; reader.ReadToFollowing("server"); reader.Read(); result.server = reader.Value; reader.ReadToFollowing("item"); while (reader.Read()) { reader.ReadToFollowing("kenteken"); reader.Read(); reader.MoveToContent(); if (reader.NodeType == System.Xml.XmlNodeType.Text) { CartalkResponseItem item = new CartalkResponseItem(); item.kenteken = reader.Value; result.resultaat[0].item.Add(item); } } } private static HttpWebRequest CreateWebRequest(string url, string action) { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Headers.Add("SOAPAction", action); webRequest.ContentType = "text/xml;charset=\"utf-8\""; webRequest.Accept = "text/xml"; webRequest.Method = "POST"; return webRequest; } private static XmlDocument CreateSoapEnvelope() { XmlDocument soapEnvelop = new XmlDocument(); string request = "<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:car=\"https://voertuiginfo.cartalk.nl/1.0/Soap/Cartalk\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">" + "<soapenv:Header/>" + "<soapenv:Body>" + " <car:transaction soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" + " <referentie xsi:type=\"xsd:string\">XXXXX</referentie>" + " <gebruiker xsi:type=\"xsd:string\">XXXXX</gebruiker>" + " <wachtwoord xsi:type=\"xsd:string\">XXXXX</wachtwoord>" + " <queryType xsi:type=\"xsd:string\">XXXXX</queryType>" + " <parameters xsi:type=\"car:ArrayOfBackend_Cartalk_Result_Parameters\" soapenc:arrayType=\"car:Backend_Cartalk_Result_Parameters[]\">" + "<item>" + " <name>XXXXX</name>" + " <value>XXXXX</value>" + "</item>" + " </parameters>" + " </car:transaction>" + "</soapenv:Body>" + "</soapenv:Envelope>"; soapEnvelop.LoadXml(request); return soapEnvelop; } private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest) { using (Stream stream = webRequest.GetRequestStream()) { soapEnvelopeXml.Save(stream); } } }
© Copyright 2024 ExpyDoc