我正在尝试自己学习一些WCF。 我有 C#/ASP.net 知识,但我是 WCF 的新手。 我在学习的同时使用Visual Studio 2010开发一些应用程序。
我开发了一个小型Web服务,它充当TODO/任务管理器的后端,用户可以在其中创建/删除/编辑新事件;这一切都非常简单和基本。
我的问题如下:
- 有没有办法让客户端选择他想要的返回格式(例如.xml/json/rdf),而无需编写新的操作合同?
- 如何在客户端上看到 Web 服务发送给我的确切消息(以便我可以检查它是例如 json 表示形式还是 xml 消息)。
使用 WCF 创建 REST 服务时,支持内容协商。
只需将automaticFormatSelectionEnabled
设置为在端点上true
。
另请参阅:WCF Web HTTP 格式设置
Web 浏览器从网站选择响应格式的方式是通过内容协商,特别是通过使用 Accept 和 Content-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。 他们的文档描述了使其工作必须采取的(非常简单的)步骤。 总而言之,你必须
- 根据您希望支持的内容类型装饰您的服务类,
- 装饰您希望具有内容谈判意识的方法,以及
- 从该方法返回可序列化的业务对象。
至于你的第二个问题,Fiddler是测试客户端和服务器的一个不错的选择。
我的经验是WCF在这方面不是很好。 MVC 是其"操作结果"概念的一大改进,它允许您为给定端点返回所需的任何内容。 (据说新的"Web API"将是WCF和MVC功能的结合。
也就是说,让客户端选择响应格式的最简单 WCF 方法是指定 Stream 返回类型,并根据要求序列化结果。
因此,像这样声明方法,并使用您选择的 JSON 和 XML 序列化程序。
[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响应。
与其选择基于SOAP的服务,不如尝试REST模型。使用 MS 技术创建 REST 或 HTTP 服务的新方法是使用 MVC 4 ASP.NET 可用的 Web API。
REST 的优点:
-
内容协商 - 客户端可以通过
Request
标头中的Accept-Type
参数指定数据类型(JSON、XML..)。 -
显式使用 HTTP 方法
-
类似目录结构的 URI
等等..