创建一个基于ASP.NET 2.0的JSON WebService
以前做的WebService基本都只是ASP.NET来调用,所以没考虑比较深入。今天有位JAVA的同事需要调用我的WebService,希望返回JSON类型的数据。原本以为是很简单的一个功能,真正做起来才发现在ASP.NET 2.0中实现起来还是有许多需要注意的地方。刚好看到一篇老外总结的关于ASP.NET 2.0中实现JSON WebService的文章,总结的非常好。所以就简单的翻译了下,希望能帮到需要的朋友。
原文地址:http://www.codeproject.com/KB/webservices/jsonwebservice.aspx
介绍
众所周知,在默认情况下ASP.NET的WebService都是返回的XML格式的数据。而处理XML数据总会导致一些额外的开销。现在,另一种名为JSON的格式,因为克服了这些问题而流行起来。从.NET 3.5开始,微软的ASP.NET 3.5中已经内置了这个功能。但是还是有很多应用都是基于ASP.NET 2.0。本文就将告诉你如何通过WebService,简单地返回JSON格式的数据,并通过jQuery进行处理。
背景
有次我在做一个项目,这个项目涉及到大量的WebService调用。处理XML的时间超出了我的预期,于是我决定使用更轻巧而且又易于JavaScript处理的JSON格式。比如我们有一个“Employee”类,包含5个字段:“Name”,“Company”,“Address”,“Phone”和“Country”。如果WebService通过默认的XML格式返回数据的话,你得到会是以下内容:
如果你以JSON格式返回的话,得到的是以下内容:
对以上两个结果进行对比,不难发现JSON返回的是一个没有XML顶部节点的字符串的值。我们只需要处理这个字符串,其中的数据都是Name:Value格式的键值对。在我继续之前,我想对JSON进行下封装。这是一种轻量级的数据交换格式。作为纯文本的格式,它得以完全独立于语言。JSON可以是两种形式的数据结构:
➔ 一个键值对的集合。一般称为Dictionary,Hashtable等等。
➔ 一个有序的值的列表。一般称为Array,List等等。
你可以在json.org了解到更多有关JSON的内容。
需求
➔ Visual Studio 2005/2008 or Visual Studio 2005/2008 Express Edition
➔ ASP.NET 2.0 AJAX Extensions 1.0
你也可以使用 Microsofe Web Platform Installer 2.0来一次性安装全套的开发所需软件。其中包括IIS。
现在就让我们开始讨论,如何实现解决方案。
安装ASP.NET AJAX Extensions 1.0。默认的安装目录是“Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025”。目录结构如下图所示:
System.Web.Extension.dll就是关键所在。你也可以安装Visual Studio 2008 Template for AJAX Extension。
实现
建立一个名为JSONDemo的简单ASP.NET WebService项目。
WebService建好后,重命名为JSON,同时添加对System.Web.Extensions.dll的引用。完成之后,项目应该想这样:
配置Web.Config
我们还需要在<system.web>节点下添加如下代码段,以完成对ScriptHanlerFactory的应用。
添加类
现在我们添加一个Employee类。
配置ASMX WebService
如果通过对象浏览器来查看system.web.extension.dll的话,会发现以下这些命名空间:
现在我们添加对System.Web.Service.Services和System.Web.Script.Serialization命名空间的引用,最终的引用列表如下:
现在,我们可以在类中添加System.Web.Script.Services命名空间中的ScriptService属性了。这个属性可以使JavaScript更方便的调用WebService。这个属性同时也使得WebService可以接收和返回JSON格式的数据。这样就避免了对XML的解析。
在添加完ScriptService属性之后,添加ScriptMethod(RsponseFormat=ResponseFormat.Json)属性,以返回JSON格式的数据。
添加了ScriptService属性的WebService,默认将会返回JSON而不是XML格式的数据。所以一般都不需要添加ResponseFormat.Json属性。不过,如果你希望你的WebService中某些Web方法依然返回XML的话,就需要专门在方法上注明ScriptMethod(ResponseFormat=ResponseFormat.Xml)。在我的例子里,添加这个属性只是为了表述更清晰。完成以上操作,最终的代码应该是这样:
现在,WebService已经准备好了。你可以直接通过浏览器来进行测试。接下来,我将展示如何在一个普通的HTML页面中,通过jQuery来调用WebService。
通过jQuery来调用WebService
下面是JQuery调用WebService的代码:
$.ajax是一个发起AJAX请求的jQuery方法,它有多种参数,相关描述如下:
➔ Type:调用WebService时,总是使用“POST”请求。
➔ url:WebService的URL以及web方法的名称。
在这个例子中,“JSON.asmx”是WebService的URL,TestJSON则是web方法。
➔ data:需要传递给web方法的参数。
➔ contentType:当调用JSON WebService的时候,这个值必须是“application/json;charset=utf-8”。
➔ dataType:基于调用的WebService的不同而设置不同的值。如果是JSON调用的话,应该设置为“json”。
➔ success:当请求得到成功的处理之后会调用这里定义的函数;在上面的例子中,我定义了一个匿名函数来处理WebService返回的结果。你也可以这样定义:
在ASP.NET 2.0中,WebService处理结果不同于ASP.NET 3.5。这就是我们使用eval函数的原因。如果使用的是ASP.NET 3.5,你可以简单的时候用msg.d,消息的属性d中就包含了内容。另外,我想解释下funciton(msg)语句。jQuery在这个参数中分配了消息的响应,从而可以做出相应的处理。
➔ error:如果有返回值的话,可以在这里使用匿名或者独立的函数来处理错误。
这就是点击JSON按钮之后的效果:
摘要
通过以上内容,可以看到在一个普通的HTML页面中通过jQuery来调用一个基于ASP.NET 2.0的JSON WebService是多么简单。之所以写这篇文章,就是因为我在做这个功能的时候,发现了许多的问题,都是因为没有一个地方总结了所有相关信息。在文章的顶部我链接了一个完整的可工作的例子。在这个项目中,包含了“System.Web.Extensions.dll”,所以你只是建立一个JSON WebService的话,甚至不需要下载ASP.NET AJAX 1.0 Extensions。但是如果你希望使用jQuery来进行客户端的处理的话,你还是需要下载。希望这篇文章能够让你在一个地方了解所有相关概念。
下载