Using the DPWS Client
This topic explains how to make a service call with your DPWS client class. The DPWS client class can be generated from a WSDL using the MfSvcUtil tool.
Sending a Request In the DPWS Client
To make a Web service request from the client, build the XML for the SOAP request using XmlWriter, and send the request using a WsHttpClient object. If the request is a two-way request that returns a response, you will also have to parse the response.
The following code example demonstrates how to call a two-way web service method.
/// <summary> /// Method calls a two-way method that sums two integers. /// </summary> /// <param name="x">A integer containing the x value to add.</param> /// <param name="y">A integer continaining the y value to add.</param> /// <returns>An integer sum of x+y.</returns> public int Request(int x, int y) { ... // call your function to build the request byte[] Request = BuildTwoWayRequest(x, y, sEndPointURI); DpwsHttpClient httpClient = new DpwsHttpClient(); // send the request DpwsSoapResponse response = httpClient.SendRequest(Request, sEndPointURI, false, false); if (response != null) { // call your function to parse the request return Parse2WayResponse(response.Header, response.Envelope); } else { ... } }
Building a Request
The following code example shows how to create a Web service request.
/// <summary> /// Method builds an Xml 2way request message. /// </summary> /// <param name="X">An integer containing the first integer to add.</param> /// <param name="Y">An integer containing the second integer to add.</param> /// <param name="endpointAddress">A string containing the service endpoint address.</param> /// <returns>The constructed request.</returns> private byte[] BuildTwoWayRequest(int X, int Y, string endpointAddress) { MemoryStream soapStream = new MemoryStream(); XmlWriter xmlWriter = XmlWriter.Create(soapStream); // Write processing instructions and root element xmlWriter.WriteProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); xmlWriter.WriteStartElement("soap", "Envelope", "http://www.w3.org/2003/05/soap-envelope"); // Write namespaces xmlWriter.WriteAttributeString("xmlns", "wsdp", null, Namespaces.GetNamespace("wsdp")); xmlWriter.WriteAttributeString("xmlns", "wsd", null, Namespaces.GetNamespace("wsd")); xmlWriter.WriteAttributeString("xmlns", "wsa", null, Namespaces.GetNamespace("wsa")); xmlWriter.WriteAttributeString("xmlns", "smpl", null, "http://schemas.example.org/SimpleService"); // Write header xmlWriter.WriteStartElement("soap", "Header", null); xmlWriter.WriteStartElement("wsa", "To", null); xmlWriter.WriteString(endpointAddress); xmlWriter.WriteEndElement(); // End To xmlWriter.WriteStartElement("wsa", "Action", null); xmlWriter.WriteString("http://schemas.example.org/SimpleService/TwoWayRequest"); xmlWriter.WriteEndElement(); // End Action xmlWriter.WriteStartElement("wsa", "From", null); xmlWriter.WriteStartElement("wsa", "Address", null); xmlWriter.WriteString(EndpointAddress); xmlWriter.WriteEndElement(); // End Address xmlWriter.WriteEndElement(); // End From xmlWriter.WriteStartElement("wsa", "MessageID", null); xmlWriter.WriteString("urn:uuid:" + Guid.NewGuid()); xmlWriter.WriteEndElement(); // End MessageID xmlWriter.WriteEndElement(); // End Header // write body xmlWriter.WriteStartElement("soap", "Body", null); xmlWriter.WriteStartElement("smpl", "TwoWayRequest", null); xmlWriter.WriteStartElement("smpl", "X", null); xmlWriter.WriteString(X.ToString()); xmlWriter.WriteEndElement(); // End X xmlWriter.WriteStartElement("smpl", "Y", null); xmlWriter.WriteString(X.ToString()); xmlWriter.WriteEndElement(); // End Y xmlWriter.WriteEndElement(); // End TwoWayRequest xmlWriter.WriteEndElement(); // End Body xmlWriter.WriteEndElement(); // Create return buffer and close writer xmlWriter.Flush(); byte[] soapBuffer = soapStream.ToArray(); xmlWriter.Close(); return soapBuffer; }
Parsing a Response
The following code shows how to parse a response.
/// <summary> /// Parses the 2way message response and returns the results. /// </summary> /// <param name="header">A WsdWsaHeader object containing a SOAP response header.</param> /// <param name="envelope">A WsdXmlDocument object containing the entire SOAP response.</param> /// <returns></returns> private int Parse2WayResponse(WsWsaHeader header, WsXmlDocument envelope) { WsXmlNode tempNode; // There should be a lot more validation hear but this is the minimal effort required to get the sum if ((tempNode = envelope.SelectSingleNode("Body/TwoWayResponse/Sum", false)) == null) { Debug.Print(""); Debug.Print("Body/TwoWayResponse/Sum element is missing. Returning 0."); return 0; } int Sum = Convert.ToInt32(tempNode.Value); return Sum; }