准备技术:
1.简单的WebService编写;
2.了解Asp.net Ajax 客户端访问WebService
内容:
asp.net ajax框架在去年看过,只是些基本的使用,并没有过多的去研究它的原理。最近在一个项目中要实现客户端访问WebService并返回DataTable类型的数据,当我调用一个返回DataTable的方法时,不能返回成功,在错误的回调函数中告诉我DataTable是一个循环应用类型,不能序列化。当是想过把DataTable替换成其他类型的数据如ArrayList或则Array等,可是有点心不甘,所以查过各个方面的资料,告诉我微软已经提供了一个解决DataTable的JavaScriptConverter的dll文件,当我在web.config中添加了对这个JavascriptConverter引用即可以将DataTable序列化成Json字符串了。
好了,废话不多说了。下面就自己来做个循环应用的实例,并通过自定义JavascriptConverter来解决循环引用的问题。本文只会简单的介绍下服务器端序列化数据类型到Json的过程,不会太深入。
首先先来定义两个类,想了半天最好的实例就是一对夫妻,一个老公只有一个老婆,这是婚姻法规定的,所以老公类型跟老婆类型就可以达到实例中的循环引用。看下两个类型的类试图:
其实两个类里面的内容都很简单,Husband.cs:
usingSystem;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.Web.Services.Protocols;
usingSystem.ComponentModel;
publicclassHusband
{
privatestring_firstName;
publicstringFirstName
{
get{return_firstName; }
set{ _firstName=value; } }privatestring_lastName;
publicstringLastName
{
get{return_lastName; }
set{ _lastName=value; } }privateWife _wife;
publicWife Wife
{
get{return_wife; }
set{ _wife=value; } }}
Wife.cs:
usingSystem;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.Web.Services.Protocols;
usingSystem.ComponentModel;
publicclassWife
{
privatestring_firstName;
publicstringFirstName
{
get{return_firstName; }
set{ _firstName=value; } }privatestring_lastName;
publicstringLastName
{
get{return_lastName; }
set{ _lastName=value; } }privateHusband _husband;
publicHusband Husband
{
get{return_husband; }
set{ _husband=value; } }}
然后我定义了个Webservice类用来提供Client的访问,HusbandService.cs:
usingSystem;
usingSystem.Collections;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.Web.Services.Protocols;
usingSystem.Xml.Linq;
usingSystem.Web.Script.Services;
/**///Husband's Method
///
[WebService(Namespace="http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[ScriptService]
publicclassHusbandService : System.Web.Services.WebService{
publicHusbandService (){
//Uncomment the following line if using designed components
//InitializeComponent();}
[WebMethod]
publicHusband GetHusband()
{
Husband hansband=newHusband();
hansband.FirstName="Henllyee";
hansband.LastName="Cui";
Wife wife=newWife();
wife.FirstName="Throwen";
wife.LastName="Yang";
hansband.Wife=wife;
wife.Husband=hansband;
returnhansband;
}
}
我在一个asp.net 页面中通过asp.net ajax对GetHusband()的应用的,JavascriptConverter.aspx:
html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
JavaScriptConverter Demo运行后当我们点击按钮是,会弹出出错的信息,告诉我们Husband是一个循环引用类型,不能序列化。这时我们可以通过编写对应的JavascriptConverter来告诉服务器端如何去序列化。
我们自定的JavascriptConverter必须继承于JavascriptConverter(JavascriptConverter参考文档),然后去重写里面的两个方法跟一个属性:
1.Deserialize:如何反序列化一个Jason到这个Converter类型;
2.Serialize:如何序列化支持的对象到一个Jason;
3.SupportedTypes:这个Converter支持的类型。
好了下面我们定义下一个Converter来支持循环引用,现在我们先定义如何将去序列化,HusbandConverter.cs:
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.HtmlControls;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Xml.Linq;
usingSystem.Web.Script.Serialization;
usingSystem.Collections.Generic;
/**///Husband's Converter
///
publicclassHusbandConverter:JavaScriptConverter
{
publicHusbandConverter()
标签: