views:

88

answers:

2

Is there a way to dynamically change the WebResponseFormat on a method given a parameter passed by the client? I default my WebResponseFormat to XML, but I want to give the client the opportunity to specify a format as JSON or XML and if none is specified, default to XML.

Currently I am doing the following:

[WebGet(UriTemplate = "objects", BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
List<SampleObject> GetObjects();

The user can call it via:

http://localhost/rest/myservice/objects

They then can specify a format by doing:

http://localhost/rest/myservice/objects?format=json

The problem is that when I try to set the response content type via:

WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";

That just returns the XML but the browser attempts to process it like a JSON object instead of serializing the response as JSON.

Is this even possible with .NET 3.5 outside of using a Stream as the return value and serializing the response myself? If not, is there a better solution?

A: 

For .NET 3.5 and WCF REST 3.5, I don't know of any way to do this elegantly.

.NET 4 and WCF REST in .NET 4 will support the "content negotiation" strategy that you use - just setting the ContentType = "application/json" will cause the service to automagically return JSON instead of XML.

So if there's any chance for you, wait for .NET 4 (should be out mid April 2010) and use that - it should offer lots of improvements in WCF anyway, especially in the WCF REST area.

marc_s
Thanks for the suggestion. .NET 4.0 has a lot of great features, but I don't think the company I am working for will be upgrading us to VS2k10 and .NET 4.0 anytime soon.See my answer on how I was able to resolve this.
Brandon
+1  A: 

I was able to resolve this by doing the following:

[WebGet(UriTemplate = "objects", BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
List<SampleObject> GetObjects();

[WebGet(UriTemplate = "objects?format=json", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
List<SampleObject> GetObjectsInJson();

It isn't pretty, but if format=xml is defined or left off, it will default to my operation contract, but if format=json is defined, it defaults to the second operation contract. This successfully returns the result as JSON and XML as desired.

Brandon