7

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

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

我的问题如下:

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

4 回答 4

9

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

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

另请参阅:WCF Web HTTP 格式

于 2012-09-27T11:15:12.957 回答
3

Web 浏览器从网站选择响应格式的方式是通过内容协商,特别是通过使用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。他们的文档描述了您必须采取的(非常简单的)步骤才能使其工作。总结一下,你必须

  1. 根据您希望支持的内容类型装饰您的服务类,
  2. 装饰您希望内容协商感知的方法,以及
  3. 从该方法返回一个可序列化的业务对象。

至于您的第二个问题,Fiddler是测试客户端和服务器的不错选择。

于 2012-06-02T01:40:54.217 回答
1

Instead of going for a SOAP based service you can try REST model. The new way of creating REST or HTTP services using MS technologies is using Web API that will be available ASP.NET MVC 4.

Advantages of REST:

  1. Content Negotiation - The client can specify the data-type(JSON, XML..) through the Accept-Type parameter in the Request header.

  2. Use HTTP methods explicitly

  3. Directory structure-like URIs

and more..

于 2012-06-02T05:17:47.123 回答
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 响应。

于 2012-06-02T00:47:38.833 回答