5

我有 WCF restul 服务,我想让用户选择他们想要的请求格式,我有装饰

    [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 只是在阅读论点,仅此而已……有什么建议吗?

4

2 回答 2

6

不,我认为您不能在运行时以编程方式执行此操作。如果从您的服务公开两个不同的端点,您当然可以做什么——一个返回 XML,另一个返回 JSON,然后以编程方式选择从客户端应用程序调用哪个端点。

马克

更新:正如 Steve Michelotti 正确指出的那样,现在可以在 WCF 4.0 中实现 JSON 和 XML 之间的这种自动切换。WCF 4.0 具有改进的 REST 支持,其中还包括基于 HTTP 接受标头的格式消息选择功能。

有关 WCF 4.0 新功能的详细信息,请参阅:开发人员对 WCF 4.0 的介绍

于 2009-06-17T21:08:35.970 回答
3

如果您的休息服务配置为自动选择响应类型,您可以执行此操作。

然后在客户端请求中只需添加所需的标头 Accept: application/json

于 2011-07-30T13:45:49.033 回答