Search code examples
xmljsonwcfwcf-endpoint

WCF - let the client choose the return format


I'm trying to learn some WCF on my own. I have C#/ASP.net knowledge but I am new to WCF. I am using Visual Studio 2010 to develop some apps while I learn.

I developed a small web service which acts as the backend for a TODO/Task manager where a user can create/delete/edit new events; it's all very simple and basic.

My questions are the following:

  1. Is there a way to let the client choose the return format he wants (e.g. xml/json/rdf) without writing new operation contracts?
  2. How can I see on the client the exact message the Web Service sends to me (so that I can check if it's for instance a json representation or an xml message).

Solution

  • The way web browsers choose response formats from web sites is via content negotiation, and in particular through the use of the Accept and Content-Type HTTP headers.

    For example, if your client requires a JSON-formatted response, it would send the server an HTTP request that looks something like this:

    GET /resource HTTP/1.0
    User-Agent: YourClient 1.0
    Accept: application/json
    

    The server, in turn, would respond with an HTTP packet like this:

    HTTP/1.0 200 OK
    Content-Type: application/json
    Content-Length: 20
    
    { "type" : "json" }
    

    WCF is unfortunately not equipped to handle content negotiation out of the box, but there is a really nice third-party library that enables it without too much work called WcfRestContrib. Their documentation describes the (quite simple) steps you have to take to make it work. To sum it up, you have to

    1. decorate your service class according to the content types you wish to support,
    2. decorate the methods you wish to be content negotiation-aware, and
    3. return a serializable business object from that method.

    As for your second question, Fiddler is a fine choice for testing both the client and the server.