开发者

WCF - Dynamically Change WebResponseFormat

开发者 https://www.devze.com 2022-12-25 16:41 出处:网络
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 s

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 = 开发者_JAVA百科"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?


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消