图 5 显示了当执行图 4 中的 Web 方法调用时在网络中传输的数据。除了 HTTP 标头外,请求中被 传输的唯一数据是用户键入的 ZIP Code,而响应中返回的唯一数据是一对表示城市和州的字符串。您不 会看到任何 SOAP 或 XML(或视图状态,就此而言)。相反,输入和输出会通过使用 JavaScript Object Notation (JSON) 进行编码,它比 XML 简短得多,也更易处理。请求和响应并不使用 SOAP,而 是使用一个简单的协议,而这个协议基本上就是 HTTP。HTTP 和 JSON 的组合使对 WebMethods 和页面 方法的 ASP.NET AJAX 调用比传统的 Web 服务调用要有效得多。
Figure5JSON 编码的 输入和输出
请求
POST /Ajax/ZipCodeService.asmx/GetCityAndState HTTP/1.1
Accept: */*
Accept-Language: en-us
Referer: :1997/Ajax/ZipCodePage.aspx
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; ...)
Host: localhost:1997
Content-Length: 15
Connection: Keep-Alive
Cache-Control: no-cache
{"zip":"98052"}
响应
HTTP/1.1 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Fri, 29 Dec 2006 21:06:17 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private, max-age=0
Content-Type: application/json; charset=utf-8
Content-Length: 16
Connection: Close
{"REDMOND", "WA"}
JSON 是一个正在崭露头角的行业标准序列化格式。它还是被 ASP.NET AJAX 使用的本机格式。 Microsoft AJAX Library 的 Sys.Serialization.JavaScriptSerializer 类支持在客户端进行 JSON 序 列化和反序列化。System.Web.Script.Serialization.JavaScriptSerializer 类支持在服务器上进行 JSON 序列化和反序列化。
并非所有类型均与 JSON 兼容。例如,JSON 不能处理具有循环引用的对象。当您需要返回不能与 JSON 兼容的复杂数据类型时,其实您可以使用 ASP.NET AJAX 的 ScriptMethod 属性将返回类型序列化 为 XML。这个技术对返回 XML 数据的方法也很有用,如下所示:
[ScriptMethod (ResponseFormat=ResponseFormat.Xml)]
public XmlDocument GetData()
{
...
}
此外,您还可以构建和注册自定义 JSON 转换器,它允许将通常不能与 JSON 兼容的类型序列化和反 序列化。ASP.NET AJAX January Futures CTP 包含三个这样的转换器:一个针对 DataSet,一个针对 DataTable,还有一个针对 DataRow。
请将您想向 Jeff 询问的问题和提出的意见发送至 wicked@microsoft.com.
Jeff Prosise是《MSDN 杂志》的一名特约编辑,同时也是包括《Microsoft .NET 程序设计技术内幕 》(微软出版社,2002)在内的多本著作的作者。他还是 Wintellect () 公司的共 同创始人之一,该公司专门从事 Microsoft .NET 软件的咨询和教育。