.NET的WebService应用实例一则关键词:.NET,WebService,ADO.NET,B/S&C/S笔者最近在开发一个小区物业管理项目。项目用户需要在广域网上使用该系统,所以B/S结构的内容肯定是需要的。然而,出于成本的考虑,客户表明只能在如下环境下使用该系统:
A. 通过512K有线通架设自己的服务器(花生壳解析域名到本地);
B. 客户端拨号上网。
哇,这么糟糕?相信没有几个倒霉鬼会遇到我这种局面了。请根据我们的上网经验,慈悲的考虑一下这里的上行和下行速率吧!
在如此有限的网络资源下,如果仅仅是B/S结构的系统,每一步操作都要和服务器进行数据(要经常传输大量数据)和消息的传输,必然导致整个系统慢的让人难以忍受。故此我们考虑还要另外加载一套C/S结构的系统,以使客户端和服务器数据和消息传递频率减至最低。如果开发通常意义上的C/S系统,将出现两个致命的弱点:
A. 每个客户端都要存放自己的数据库文件,意味着将要部署数据库环境(本系统使用Sql Server2000),当然也可以通过自己编写文件格式和链接库,存储和读写数据,但缘于需求中数据表格的复杂性,这种做法必然会大大增加开发的复杂性,同时会影响到数据库的运行效率;
B. 重复劳动:B/S部分的内容也要重复实现在C/S结构上。注意,两部分内容不是补充的关系,而是重复、重复、再重复,这是客户的需求,只有上帝知道客户为何要这么做。.NET的WebService的架构模式,能很好的解决上述问题。下面我将通过一个生动的例子展示这种系统架构的核心内容。本示例使用Sql Server 2000作为库环境,使用Northwind作为目标数据库,web服务器和数据库服务器架设在同一台机器上,使用Windows 2000 Server操作系统。下面展示如何通过WebService的架构,实现B/S和C/S并行系统上的数据读写功能。目标:
A. 通过客户端的桌面程序读取Customers数据表的内容,并保证读取的内容驻留在本地机器的内容中,其他地方需要使用数据的时候,不必向服务器发出请求;
B. 能够在此客户端无限此增加记录,并在客户确认要导入数据库时,一次性将所有新增记录推进到服务器端的数据库中。可以保证不必每次增加记录都要和服务器交换内容;
C. 在B/S结构下,无需另外再写数据库接口程序段,利用现有内容直接获得数据源,在IE的浏览器页面显示和增加数据库内容,从而避免了重复劳动,提高了程序的内部复用度。思路:
A. 在服务器端写入一WebService程序,提供两个服务接口:
GetDataSet():返回一个包含Customers表的DataSet给调用程序;
InputDataSet(DataSet ds1):由调用程序提供一个DataSet(包含了修改后的Customers表),在WebService程序获得该DataSet时更新数据库内容。
B. 编写桌面程序,引用上述web服务,通过GetDataSet(),获得数据源,通过DataGrid控件在本地显示。并可在本地内容中增加记录,直到确认要导入数据库,调用InputDataSet(DataSet ds1),批量将内容写入服务器端的数据库。
C. 编写web应用程序,调用GetDataSet()显示数据,通过InputDataSet(DataSet ds1)增加数据。实施过程:
 Visual Studio.NET环境下,新建一个web项目:选择C#下的ASP.NET Web应用程序,工程名为 TestCommunity;
 在解决方案资源管理器内,选定项目,右键添加新项,在对话框中展开“Web项目项”,选择“代码”下的“Web服务”,使用默认文件名“Service1.asmx”,打开后生成一WebService类文件并处于打开状态;
 在Service1.asmx[设计]窗口下,拖入一个SqlDataAdapter控件,根据向导提示,选定Northwind数据库,默认情况下,会加载一个SqlConnection对象SqlConnection1,SqlDataAdapter对象名位SqlDataAdapter1;
 切换到代码文件(Service1.asmx.cs),向Service1类中添加一个DataSet对象实例ds,在该类的构造函数中添加代码,定义一个数据库连接字符串,以保证数据库正确连接(系统自动生成的SqlConnection1.ConnectString可能有误),然后定义两个公共服务[WebMothd],内容如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Data .SqlClient ;namespace TestCommunity
{
[WebService(Namespace="http://aishg/webservices/")]
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
InitializeComponent();
connStr="server=localhost;database=Northwind;uid=sa;pwd=sa";
}
private System.Data.SqlClient.SqlDataAdapter sqlDataAdapter1;
private System.Data.SqlClient.SqlCommand sqlSelectCommand1;
private System.Data.SqlClient.SqlCommand sqlInsertCommand1;
private System.Data.SqlClient.SqlCommand sqlUpdateCommand1;
private System.Data.SqlClient.SqlCommand sqlDeleteCommand1;
private System.Data.SqlClient.SqlConnection sqlConnection1;
private System.Data .DataSet ds;
private string connStr;
#region 组件设计器生成的代码
…….///这段是系统自动生成代码,可以不管;
#endregion [WebMethod]
public DataSet GetDataSet()
{
ds=new DataSet ();
this.sqlConnection1.ConnectionString =connStr;
sqlConnection1.Open ();
this.sqlDataAdapter1 .Fill (ds,"customers");
sqlConnection1.Close ();
return ds;
} [WebMethod]
public void InputDataSet(DataSet ds1)
{
ds=new DataSet ();
this.sqlConnection1.ConnectionString =connStr;
sqlConnection1.Open ();
this.sqlDataAdapter1 .Fill (ds,"customers");
ds=ds1;
this.sqlDataAdapter1.Update (ds,"customers");
sqlConnection1.Close ();
}
}
}