Tuesday, September 6, 2016

How to serialize an object into string\xml with its headers

Leave a Comment

I'm using a third side web service client (created by using the "Add service reference") in order to retrieve some data.

After filling the web service objects with proper data we need to add some data to the headers (encrypted password and some other predefined data)

Then, we are serializing every request sent to the web service, using the standard .net XmlSerializer.

However, in the result of the serialization I don't see the headers of the request. I've searched for a long time and couldn't find any way to "print" them as well.

Here is some example code:

Ibooking proxy = new BookingManager();  /* Init proxy Data...*/ GetAvailabilityRequest request = new GetAvailabilityRequest();  /*Fill more data on the request...*/ GetAvailabilityResponse response = proxy.GetAvailability(request); //Send request to the web service var xmlString2 = response.Serialize(); //only body, no headers in the XML   /* Extension class to Serialize any object */ public static class ExtensionUtil {     public static string Serialize<T>(this T value)     {         try         {             XmlSerializer  xmlserializer = new XmlSerializer(typeof(T));             var stringWriter = new StringWriter();             using (var writer = XmlWriter.Create(stringWriter))             {                 xmlserializer.Serialize(writer, value);                 return stringWriter.ToString();             }         }         catch (Exception ex)         {             throw new Exception("An error occurred", ex);         }     } } 

I've excluded the code that adds more data to the request since it's long and complicated (need to implement IEndpointBehavior and IClientMessageInspector to "catch" the request before we send it) - but currently as a workaround I put a BreakPoint on the Message object and convert it into string using Visual Studio. In this way I do see the headers but obviously this is bad practice since I want it to be automated in the serialization.

3 Answers

Answers 1

GetAvailabilityResponse response = proxy.GetAvailability(GetAvailabilityRequest()); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = false;  XmlWriter writer = XmlWriter.Create(response, settings); 

Hope it will help.

Answers 2

I would like to see an example of how you are adding these headers.

In most web services the message body is the part that is serialized into XML or JSON - the headers are not.

You may be able to inspect the service call by using Fiddler and a proxy implemented by a small change in your web.config as described in this article: http://weblog.west-wind.com/posts/2008/Mar/14/Debugging-Http-or-Web-Services-Calls-from-ASPNET-with-Fiddler.

The short version of this is to add the following to your web.config or app.config:

    <system.net>         <defaultProxy>             <proxy  proxyaddress="http://127.0.0.1:8888" />               </defaultProxy>     </system.net> 

Download and run Fiddler while calling the service and you should see and be able to inspect the call in Fiddler.

If you want to inspect and/or modify the headers within your code base could look into implementing IClientMessageInspector or IDispatchMessageInspector. Here are a couple articles on the topic:

https://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector(v=vs.100).aspx http://weblogs.asp.net/paolopia/writing-a-wcf-message-inspector

Here is an implementation I did. I didn't need access the headers, but rather to modify the xml namespaces created by the service client, but it should give you an idea on how to do the implementation: How can I create custom XML namespace attributes when consuming a legacy SOAP service?

Answers 3

OperationContext is your friend here. Use an OperationContextScope to wrap the call to the service, then use OperationContext.Current to get at all the hidden goodies you need.

https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontextscope(v=vs.110).aspx

Note that you'll need to know the specific types of the headers you want to get at, and I've had some trouble getting at the values, rather than just the names, of headers if they're not marked as serializable when using XmlSerializer

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment