WCF - 让客户选择返回格式

时间:2012-06-02 00:31:30

标签: xml json wcf wcf-endpoint

我正在尝试自己学习一些WCF。我有C#/ ASP.net知识,但我是WCF的新手。我在学习的过程中使用Visual Studio 2010来开发一些应用程序。

我开发了一个小型Web服务,它充当TODO /任务管理器的后端,用户可以在其中创建/删除/编辑新事件;这一切都非常简单和基本。

我的问题如下:

  1. 有没有办法让客户选择他想要的返回格式(例如xml / json / rdf)而无需编写新的操作合同?
  2. 如何在客户端上看到Web服务发送给我的确切消息(以便我可以检查它是否是例如json表示或xml消息)。

4 个答案:

答案 0 :(得分:9)

使用WCF创建REST服务时,支持内容协商。

您只需在端点上将automaticFormatSelectionEnabled设置为true即可。

另请参阅:WCF Web HTTP Formatting

答案 1 :(得分:3)

网络浏览器从网站选择响应格式的方式是content negotiation,特别是通过使用AcceptContent-Type HTTP标头。

例如,如果您的客户端需要JSON格式的响应,它将向服务器发送一个如下所示的HTTP请求:

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

反过来,服务器会响应这样的HTTP数据包:

HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 20

{ "type" : "json" }
很遗憾,WCF没有能力处理开箱即用的内容协商,但是有一个非常好的第三方库可以在没有太多工作的情况下启用它WcfRestContrib。他们的documentation描述了为使其工作而必须采取的(非常简单的)步骤。总结一下,你必须

  1. 根据您希望支持的内容类型装饰您的服务类
  2. 装饰您希望内容协商感知的方法,
  3. 从该方法返回可序列化的业务对象。
  4. 至于你的第二个问题,Fiddler是测试客户端和服务器的不错选择。

答案 2 :(得分:1)

我的经验是,WCF在这方面并不出色。 MVC是一个很大的改进,它的“动作结果”概念让你可以返回给定端点的任何你想要的东西。 (据说新的“Web API”将是WCF和MVC功能的结合。)

也就是说,让客户选择响应格式的最简单的WCF方法是指定 Stream 返回类型,并根据需要序列化结果。

所以声明这样的方法,并使用您选择的JSONXML的序列化器。

[OperationBehavior]
[WebGet()]
public Stream SomeOperation(string format)
{
    string test = "Hello world";
    string encodedResult;
    if (format.ToLower() == "xml") {
        // serialize as XML (eg, XML Serializer)
        HttpContext.Current.Response.ContentType = "text/xml";
    }
    else if (format.ToLower() == "json") {
        // serialize as JSON (eg, Newtonsoft Json)
        HttpContext.Current.Response.ContentType = "application/json";
    }
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(encodedResults));
    return ms;
}

对于第二个问题,我建议使用像Fiddler这样的免费工具来检查服务器的原始HTTP响应。

答案 3 :(得分:1)

您可以尝试使用REST模型,而不是使用基于SOAP的服务。使用MS技术创建REST或HTTP服务的新方法是使用可用于ASP.NET MVC 4的Web API

REST的优点:

  1. 内容协商 - 客户端可以通过Accept-Type标题中的Request参数指定数据类型(JSON,XML ..)。

  2. 明确使用HTTP方法

  3. 类似目录结构的URI

  4. 以及更多......

相关问题