webservice
实例
(
二
)
qq
群:
19877329
Mail: yufan27209@qq.com
By: jfan 2007-07-23
上篇文章介绍了些
webservice
的基本特性和我们例子的结构
,
这篇文章我们将开始具体的代码编写工作
.
这个专题主要讲述的是
webservice,
因此这里我们的代码以
Webservice
相关为主
,
而其他工程
,
例如
:usewebservice
只作简略介绍
.
在
VS2005
中
,
开发一个
webservice
并不是件困难的事
,
首先
,
我们新建一个
webservice
项目
(
文件
->
新建
->
网站
->ASP.NET WEB
服务
)
建完这个工程
,
我们将看到一个叫
Service.asmx
的文件
,
这就是
webservice
的标准文件
,
它也有
UI
的概念
,
不过我们一般不关注
,
因此
,
我们查看其
cs
代码文件
.
如果你什么都还没做的话
,
将看见一个被注释掉的
helloworld
的
WebMethod,
把注释去掉
,
在运行
,
你就可以得到最简单的
webservice
运行实例了
.
点击
"helloworld"
将执行其方法
.
显然
,
这个函数对我们的意义只在于宏观的了解了下
web
服务的写法
.
下面
,
我们将开始具体介绍
webservice
的写法
.
在代码文件里
,
如果我们写了一个函数后
,
希望此函数成为外部可调用的接口函数
,
我们必须在函数上面添上一行代码
[WebMethod(Description="
函数的描述信息
")],
如果你的函数没有这个申明
,
它将不能被用户引用
.
如
:
[WebMethod(Description="
最简单的方法
")]
public string HelloWorld()
{
return "Hello World";
}
public string HelloWorld()
{
return "Hello World";
}
这个函数就是外部可调用的接口函数
,
对用户来说相当于一个
API
.
如果某用户在引用了这个服务后
,
他调用
HelloWorld()
方法
,
他就将获得
"HelloWorld"
这个返回值
.
API (Application Programming Interface)
所谓
API
本来是为
C
和
C++
程序员写的。
API
说来说去,就是一种函数,他们包含在一个附加名为
DLL
的动态连接库文件中。用标准的定义来讲,
API
就是
Windows
的
32
位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在
Windows95
和
Windows NT
操作系统上的应用程序。
看到这里
,
我们是不是发现
,
其实
webservice
并不是那么的神秘
,
它也不过只是个接口
,
对我们而言
,
侧重点依然是接口函数的编写
.
下面
,
我将给出我们的例子所需要的接口函数
.
public
class Service : System.Web.Services.WebService
{
AdoNetCon
anc = new AdoNetCon(ConfigurationSettings.AppSettings["ZWOAConnectionString"]);
//
这是我写的一个类,用来操作数据库
public Service () {
//
如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod(Description="hello method")]
public string HelloWorld() {
return "Hello World";
}
[WebMethod(Description = "
获取需要的信息"
)]
public XmlDataDocument GetSiteAData()
{
DataSet ds = new DataSet();
try
{
ds = anc.RunProc("select car_id,car_chePai,car_trademark from [zw_db].[dbo].tb_car",ds);
XmlDataDocument xd = new XmlDataDocument(ds);
return xd;
}
catch
{
//System.Web.HttpContext.Current.Response.Write("Error!");
return null;
}
}
[WebMethod(Description = "
查询获取需要的信息"
)]
public XmlDataDocument getCar(string car_id,string car_chePai)
{
DataSet ds = new DataSet();
try
{
string sql;
sql = "select car_id,car_chePai,car_trademark from [zw_db].[dbo].tb_car where 1=1";
if ((car_id == null) || (car_id.Length == 0))
;
else
sql = sql +" and car_id =" + "'" + car_id + "'";
if ((car_chePai == null) || (car_chePai.Length == 0))
;
else
sql = sql + " and car_chePai like " + "'%" + car_chePai + "%'";
ds = anc.RunProc(sql, ds);
XmlDataDocument xd = new XmlDataDocument(ds);
return xd;
}
catch
{
//System.Web.HttpContext.Current.Response.Write("Error!");
return null;
}
}
[WebMethod(Description = "insert")]
public bool addCar(string car_chePai)
{
try
{
string sql;
sql = "insert into [zw_db].[dbo].tb_car(car_chePai) values(" + "'" + car_chePai + "'" + ")";
if ((car_chePai == null) || (car_chePai.Length == 0))
return false;
else
{
anc.RunProc(sql);
return true;
}
}
catch
{
//System.Web.HttpContext.Current.Response.Write("Error!");
return false;
}
}
}
这是获取资源站点信息的一个接口函数
.
里面大部分的代码
,
我想对于有一定
asp.net
基础的朋友来说
,
都应该是一看就明白。
细心的朋友可能会发现这个函数的返回类型似乎比较特殊
,
是个
xml
的文档
.
我们在前面已经说过
,webservice
只能传输序列化数据
,xml
显然满足条件
,
但比如
hash
表之类的非序列化数据
,
是不能传输的
,xml
使用最为广泛
,
而且考虑到跨平台应用
,
所以这里我们只以
xml
数据的传输来示例
.
我们先简单解释下
GetSiteAData()
函数
.
函数功能很简单
,
只是要返回查询结果
,
其数据格式是
XmlDataDocument.
当查询失败时
(
无匹配查询结果
)
,返回一个空记录
.
否则
,
我们把查询后的
dataset
生成一个
XmlDataDocument,
接下来
,
由于该项目的需要
,
我加入了一个循环
,
添加
dataset
里所没有的节点
,
站点名称
.
在这之后
,
算是完成了一个符合我们期望格式的
xml
数据文档
,
我们把它返回
.
好了
,webservice
的方法函数介绍完了
(
这里还有个
web
服务方法
,
稍后介绍
),
接下来我们的任务是怎么调用它了
.
首先把
webservice
的项目编译完成
,
假定我们这个服务是针对资源站点
A
的
,
我们不妨称其为
ServiceA.
先单独运行
asmx
文件
,
执行
GetSiteAData()
方法
,
将提示你输入参数
,
你输入要搜索的内容
,
点确认
,
将返回给你一个
xml
数据
,
并在
ie
上显示出来
,
这就是你搜索到的内容拉
.
这里对
ServiceA
的工作再做点介绍
,
在我们这个项目里
,
它是资源站点
A
提供的服务
,
意思是
,
它查询的数据将全来源于站点
A,
而站点
A
资源添加在本项目也有专门的工程实现
.
好了
,
回到正题
.
这里我介绍
vs
调用
webservice
的方法
,
其实其他平台的调用方法也是大同小异
.
首先我们介绍
web
引用方式
,
这种方式我强烈建议调试时使用
,
非常方便
.
右击引用
,
点添加
web
引用
,
输入你的
webservice
地址
,
你必须保证你输入的
webservice
存在
.
然后引用即可
,
注意
:web
引用名将作为你加入的
webservice
的名字空间
.
比如你输入了
:
localhost
,
那服务的实例化将是这样
:
localhost
.Service1 serviceA=new
localhost
.Service1();(Service1
是服务的类名
).
完成了这一步
,service
的调用似乎变的那么简单
,
我们已经实现了远程实例化
,
接下来的远程调用也是一样的容易
.
下面给出资源采集站
ServiceGatherSite
的绑定代码
(
只采集
A
站点的信息
)
XmlDataDocument
xd = new XmlDataDocument();
DataSet ds = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
localhost.Service ge = new localhost.Service();
XmlNode xmlNode1;
XmlDataDocument xd = new XmlDataDocument();
StringBuilder xmlString1;
xmlNode1 = ge.GetSiteAData();
if (xmlNode1 == null) //--
存储过程执行失败
return;
xmlString1 = new StringBuilder(xmlNode1.OuterXml);
if (xmlString1.ToString().Equals("<NewDataSet xmlns=/"/"></NewDataSet>"))
return;
xd.LoadXml(xmlString1.ToString());
ds.ReadXml(new XmlNodeReader(xd));
GridView1.DataSource = ds.Tables[0].DefaultView;
GridView1.DataBind()
;}
此段代码给出了
xml
转化成
dataset
的解决方案
,
虽然这不是必须的
,
但毕竟在
asp.net
里
,dataset
占的作用之重
,
谁都知道的
.
其他的请朋友们先看
(
呵呵
,
个中高手就免了
)