c ajax 调用webservice,Asp.net Ajax WebService 实现循环引用(自定义JavascriptC

准备技术:

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的过程,不会太深入。

首先先来定义两个类,想了半天最好的实例就是一对夫妻,一个老公只有一个老婆,这是婚姻法规定的,所以老公类型跟老婆类型就可以达到实例中的循环引用。看下两个类型的类试图:

6c1555302777729326ca3efa0910d9ec.png

其实两个类里面的内容都很简单,Husband.cs:

6c1555302777729326ca3efa0910d9ec.pngusingSystem;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Services;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Services.Protocols;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.ComponentModel;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicclassHusband

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.pngprivatestring_firstName;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicstringFirstName

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngget6c1555302777729326ca3efa0910d9ec.png{return_firstName; }6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngset6c1555302777729326ca3efa0910d9ec.png{ _firstName=value; }6c1555302777729326ca3efa0910d9ec.png    }6c1555302777729326ca3efa0910d9ec.pngprivatestring_lastName;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicstringLastName

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngget6c1555302777729326ca3efa0910d9ec.png{return_lastName; }6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngset6c1555302777729326ca3efa0910d9ec.png{ _lastName=value; }6c1555302777729326ca3efa0910d9ec.png    }6c1555302777729326ca3efa0910d9ec.pngprivateWife _wife;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicWife Wife

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngget6c1555302777729326ca3efa0910d9ec.png{return_wife; }6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngset6c1555302777729326ca3efa0910d9ec.png{ _wife=value; }6c1555302777729326ca3efa0910d9ec.png    }6c1555302777729326ca3efa0910d9ec.png}6c1555302777729326ca3efa0910d9ec.png

Wife.cs:

6c1555302777729326ca3efa0910d9ec.pngusingSystem;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Services;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Services.Protocols;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.ComponentModel;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicclassWife

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.pngprivatestring_firstName;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicstringFirstName

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngget6c1555302777729326ca3efa0910d9ec.png{return_firstName; }6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngset6c1555302777729326ca3efa0910d9ec.png{ _firstName=value; }6c1555302777729326ca3efa0910d9ec.png    }6c1555302777729326ca3efa0910d9ec.pngprivatestring_lastName;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicstringLastName

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngget6c1555302777729326ca3efa0910d9ec.png{return_lastName; }6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngset6c1555302777729326ca3efa0910d9ec.png{ _lastName=value; }6c1555302777729326ca3efa0910d9ec.png    }6c1555302777729326ca3efa0910d9ec.pngprivateHusband _husband;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicHusband Husband

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngget6c1555302777729326ca3efa0910d9ec.png{return_husband; }6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngset6c1555302777729326ca3efa0910d9ec.png{ _husband=value; }6c1555302777729326ca3efa0910d9ec.png    }6c1555302777729326ca3efa0910d9ec.png}6c1555302777729326ca3efa0910d9ec.png

然后我定义了个Webservice类用来提供Client的访问,HusbandService.cs:

6c1555302777729326ca3efa0910d9ec.pngusingSystem;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Collections;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Linq;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Services;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Services.Protocols;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Xml.Linq;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Script.Services;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png/**6c1555302777729326ca3efa0910d9ec.png///Husband's Method

6c1555302777729326ca3efa0910d9ec.png///

6c1555302777729326ca3efa0910d9ec.png[WebService(Namespace="http://tempuri.org/")]

6c1555302777729326ca3efa0910d9ec.png[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]

6c1555302777729326ca3efa0910d9ec.png[ScriptService]

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicclassHusbandService : System.Web.Services.WebService6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngpublicHusbandService ()6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png//Uncomment the following line if using designed components 

6c1555302777729326ca3efa0910d9ec.png//InitializeComponent();6c1555302777729326ca3efa0910d9ec.png}6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png    [WebMethod]

6c1555302777729326ca3efa0910d9ec.pngpublicHusband GetHusband()

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.png        Husband hansband=newHusband();

6c1555302777729326ca3efa0910d9ec.png        hansband.FirstName="Henllyee";

6c1555302777729326ca3efa0910d9ec.png        hansband.LastName="Cui";

6c1555302777729326ca3efa0910d9ec.png        Wife wife=newWife();

6c1555302777729326ca3efa0910d9ec.png        wife.FirstName="Throwen";

6c1555302777729326ca3efa0910d9ec.png        wife.LastName="Yang";

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png        hansband.Wife=wife;

6c1555302777729326ca3efa0910d9ec.png        wife.Husband=hansband;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngreturnhansband;

6c1555302777729326ca3efa0910d9ec.png    }6c1555302777729326ca3efa0910d9ec.png    

6c1555302777729326ca3efa0910d9ec.png}6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png

我在一个asp.net 页面中通过asp.net ajax对GetHusband()的应用的,JavascriptConverter.aspx:

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pnghtml PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.pngJavaScriptConverter Demo 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png
6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png
6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png 6c1555302777729326ca3efa0910d9ec.png

运行后当我们点击按钮是,会弹出出错的信息,告诉我们Husband是一个循环引用类型,不能序列化。这时我们可以通过编写对应的JavascriptConverter来告诉服务器端如何去序列化。

我们自定的JavascriptConverter必须继承于JavascriptConverter(JavascriptConverter参考文档),然后去重写里面的两个方法跟一个属性:

1.Deserialize:如何反序列化一个Jason到这个Converter类型;

2.Serialize:如何序列化支持的对象到一个Jason;

3.SupportedTypes:这个Converter支持的类型。

好了下面我们定义下一个Converter来支持循环引用,现在我们先定义如何将去序列化,HusbandConverter.cs:

6c1555302777729326ca3efa0910d9ec.pngusingSystem;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Data;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Configuration;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Linq;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Security;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.UI;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.UI.HtmlControls;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.UI.WebControls;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.UI.WebControls.WebParts;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Xml.Linq;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Web.Script.Serialization;

6c1555302777729326ca3efa0910d9ec.pngusingSystem.Collections.Generic;

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png/**6c1555302777729326ca3efa0910d9ec.png///Husband's Converter

6c1555302777729326ca3efa0910d9ec.png///

6c1555302777729326ca3efa0910d9ec.pngpublicclassHusbandConverter:JavaScriptConverter

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png{

6c1555302777729326ca3efa0910d9ec.pngpublicHusbandConverter()

6c1555302777729326ca3efa0910d9ec.png

6c1555302777729326ca3efa0910d9ec.png6c1555302777729326ca3efa0910d9ec.png标签:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值