2009-06-17 85 views
4

我有一个WCF restul服务,我想允许用户选择他们想要的请求格式,我有装饰WCF WebInvoke ResponseFormat

[OperationContract] 
    [WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "getstreamurl?ch={ch}&format=xml")] 
    [WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "getstreamurl?ch={ch}&format=json")] 

首先,有没有在指定ResponseFormat方式运行时并将格式作为参数传递给方法?从阅读周围我不这么认为...好吧接下来的事情 上面的代码是可以和工作,但即时通讯有问题,我希望能够指定一个默认值,所以当没有格式的争论通过,那么我只是默认的,但如果我装点像这样

[WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "getstreamurl?ch={ch})] 

    [OperationContract] 
    [WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "getstreamurl?ch={ch}&format=json")] 

凡XML是默认的,如果我尝试通过浏览器来调用服务方法,它告诉我,:

UriTemplateTable不支持有相当的多个模板路径作为模板'getstreamurl?ch = {ch}',但具有不同的查询字符串,其中查询字符串不能全部通过字面值消除歧义。有关更多详细信息,请参阅UriTemplateTable的文档

它们显然可以区分,但看起来WCF只读取参数并且多数民众赞成它......任何建议?

回答

5

不,我不认为你可以在运行时以编程的方式做到这一点。当你要从你的服务中暴露出两个不同的端点时,你会怎么做可以 - 一个返回XML,另一个返回JSON,然后以编程方式选择从客户端应用程序调用哪一个端点。

马克

更新:史蒂夫·米凯洛蒂正确地指出,这JSON和XML之间的自动切换,现在可以在WCF 4.0实现。 WCF 4.0具有改进的REST支持,该支持还包括基于HTTP Accept头的格式化消息选择功能。

有关WCF 4.0的新功能的详细信息,请参阅:A Developer's Introduction to WCF 4.0

+0

这是不正确的。正如Regfor在他的回应中指出的那样,您可以通过在Accept头中传递适当的值来让相同的端点返回XML或json。 – 2011-07-31 02:25:20

+1

@Steve Michelotti:这个新功能是在.NET 4.0的WCF 4.0中引入的 - 在2009年6月,当我用WCF 3.5 – 2011-07-31 07:13:32

3

如果你的休息服务配置自动选择响应类型你可以做到这一点。

然后在客户端请求上简单地添加需要的头Accept:application/json

相关问题