RDW Transactionele Services AFS SOAP services en .NET Het

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);
}
}
}