admin 管理员组文章数量: 888297
2023年12月22日发(作者:margine是什么意思)
首先,我们必须了解什么是webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接口,里面有函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态.即是客户不了解(也不需要)其过程,他们只获取数据.
webservice传递的数据只能是序列化的数据,典型的就是xml数据,这里我们也只讨论xml数据的传输.
有了一些对xml webservice的初步了解后,我们将切入正题,即是用一个具体的webservice事例的形式来讲解具体的webservice用法,用具体的事例来讲解一个概念我想怎么也要比单纯的说理能让人容易理解吧.
这里,我们将以一个简单的分布式课件搜索系统为例来讲解.使用VS2003为编译环境,C#为语言,SqlServcer2000为数据库.(这个例子来源于一位网上朋友的文章的启发,觉得很能代表webservice的特点,就按那个想法做了这么个系统来示例了)
首先,明确我们要做什么.我们需要一个对客户的接口,也就是个站点,我们把它称做ServiceGatherSite,它是何种形式都无所谓,甚至它本身并不需要数据库,它只是提供给用户一个查询的接口,真正的服务,普通用户是不接触到的.然后,这里我们还需要若干个提供服务的站点,我们可以称它们为资源站,这里为简单起见,假设有两个资源站,分别叫WebSiteA,WebSiteB,它们可以是不对外公布的,只是为了丰富查询数据而存在.最后,是我们最需要关注的东西---资源站提供给ServiceGatherSite的服务.两个资源站,就有两个服务,我们称为SiteAService和SiteBService.两个服务间没有任何关系,内部提供的方法也完全没关联,只是需要把方法如何使用告诉ServiceGatherSite,意思是,服务只提供查询接口,返回的数据如何处理,服务本身并不管,全由使用服务的站点分配.
写了这么多,算是简要的介绍了下有关xml webservice的概念和我们这个例子的结构,下篇文章,我们将开始真正进入代码的设计阶段.
上篇文章介绍了些webservice的基本特性和我们例子的结构,这篇文章我们将开始具体的代码编写工作.
这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只将简略介绍.
在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件->新建->项目->C#->Web服务应用程序)
建完这个工程,我们将看到一个叫的文件,这就是webservice的标准文件,它也有UI的概念,不过我们一般不关注,因此,我们查看其cs代码文件.如果你什么都还没做的
话,将看见一个被注释掉的helloworld的WebMethod,把注释去掉,在运行,你就可以得到最简单的webservice运行实例了.点击"helloworld"将执行其方法.显然,这个函数对我们的意义只在于宏观的了解了下web服务的写法.
下面,我们将开始具体介绍webservice的写法.在代码文件里,如果我们写了一个函数后,希望此函数成为外部可调用的接口函数,我们必须在函数上面添上一行代码[WebMethod(Description="函数的描述信息")],如果你的函数没有这个申明,它将不能被用户引用.如:
[WebMethod(Description="最简单的方法")]
public string HelloWorld()
{
return "Hello World";
}
这个函数就是外部可调用的接口函数,对用户来说相当于一个API.如果某用户在引用了这个服务后,他调用HelloWorld()方法,他就将获得"HelloWorld"这个返回值.
看到这里,我们是不是发现,其实webservice并不是那么的神秘,它也不过只是个接口,对我们而言,侧重点依然是接口函数的编写.下面,我将给出我们的例子所需要的接口函数.
[WebMethod(Description="查询以获取需要的课件信息")]
public XmlDataDocument GetSiteAData(string AssignName)
{
XmlDataDocument xd=new XmlDataDocument(); //
DataSet ds=new DataSet();
CStoreProc cp=new CStoreProc("SearchAssign");
In("@keywords",r,30,AssignName);
Out("@res",);
if(Proc()) //如果执行成功,存储过程
{
eConstraints=false; //不进行格式严格检查
if((int)urnValue("@res")==-1)
{
string xml="
l(xml);
return xd;
}
xd=new XmlDataDocument();
XmlNode root1=ntElement;
XmlNodeList roots=Nodes("list");
foreach(XmlNode roota in roots) //为所有元素加上站点名称标记
{
XmlElement Link=Element("SiteName");
ext=tings["SiteName"].ToString();
Child(Link);
}
return xd;
}
else return null;
}
这是获取资源站点信息的一个接口函数.里面大部分的代码,我想对于有一定基础的朋友来说,都应该是一看就明白,这里只说明下CStoreProc,这是我封装的一个存储过程类,主要功能是执行各种类型的存储过程.
细心的朋友可能会发现这个函数的返回类型似乎比较特殊,是个xml的文档.我们在前面已经说过,webservice只能传输序列化数据,xml显然满足条件,但比如hash表之类的非序列化数据,是不能传输的,xml使用最为广泛,而且考虑到跨平台应用,所以这里我们只以xml数据的传输来示例.
在下篇文章,我们将深入解析webservice的精髓---xml 数据传输.今天不早了,早点睡了:)
接上篇文章,我们先简单解释下GetSiteAData(string AssignName)函数.
函数功能很简单,只是要返回查询结果,其数据格式是XmlDataDocument.当查询失败时(无匹配查询结果),我们构造一个xml,返回一个空记录.否则,我们把查询后的dataset生成一个XmlDataDocument,接下来,由于该项目的需要,我加入了一个循环,添加dataset里所没有的节点,站点名称.在这之后,算是完成了一个符合我们期望格式的xml数据文档,我们把它返回.
好了,webservice的方法函数介绍完了(这里还有个web服务方法,稍后介绍),接下来我们的任务是怎么调用它了.首先把webservice的项目编译完成,假定我们这个服务是针对资源站点A的,我们不妨称其为ServiceA.先单独运行asmx文件,执行GetSiteAData(string
AssignName)方法,将提示你输入参数,你输入要搜索的内容,点确认,将返回给你一个xml数据,并在ie上显示出来,这就是你搜索到的内容拉.
这里对ServiceA的工作再做点介绍,在我们这个项目里,它是资源站点A提供的服务,意思是,它查询的数据将全来源于站点A,而站点A资源添加在本项目也有专门的工程实现.
好了,回到正题.这里我介绍vs调用webservice的方法,其实其他平台的调用方法也是大同小异.首先我们介绍web引用方式,这种方式我强烈建议调试时使用,非常方便.右击引用,点添加web引用,输入你的webservice地址,如:localhost/aspxproject/WebServiceSolution/SiteBService/,你必须保证你输入的webservice存在.然后引用即可,注意:web引用名将作为你加入的webservice的名字空间.比如你输入了:SiteA,那服务的实例化将是这样:e1 serviceA=new
e1();(Service1是服务的类名).
完成了这一步,service的调用似乎变的那么简单,我们已经实现了远程实例化,接下来的远程调用也是一样的容易.下面给出资源采集站ServiceGatherSite的绑定代码(只采集A站点的信息)
//绑定数据
public void BindData()
{
serviceA=new e1();
DataSet ds=new DataSet();
XmlNode xmlNode1;
XmlDataDocument xd=new XmlDataDocument();
StringBuilder xmlString1;
xmlNode1=eAData(strSearch);
if(xmlNode1==null) //--存储过程执行失败
return;
xmlString1=new StringBuilder(ml);
if(ng().Equals("
return ;
l(ng());
l(new XmlNodeReader(xd));
urce=["list"].DefaultView;
nd();
}
此段代码给出了xml转化成dataset的解决方案,虽然这不是必须的,但毕竟在里,dataset占的作用之重,谁都知道的.其他的请朋友们先看(呵呵,个中高手就免了),在下篇文章中将会有对它的一些解释与及多服务分布调用的解决方案,写了三篇了,发现似乎还是有些朋友看的,那我就献丑继续写下去好了,大家有什么意见也希望提出,在下的理解存在偏驳也再所难免,希望谅解:)
好了,时候不早了,休息去了,下次有时间继续:)
架设webservice简单实例
2009-08-24 19:22
具体步骤如下:
一、打开VS。NET的集成开发环境,FILE菜单上选择New,新建一个C#的
Web Service工程,工程名为WebServiceDemo(完整的是
localhost/WebServiceDemo)。这是VS就在你的Web系统目录下生成了相应的文件,我的服务目录是默认的c:Inetpubwwwroot,生成的文件就在c:InetpubwwwrootwebserviceDemo下,就不多说了。
二、打开与生成工程对应的C#源文件,这里是,集成环境已经为你生成了相应的代码如下:
//
=============================================================================
// 文件:
// 描述: 架构一个Web Service来对数据库进行互访
//
//
//
============================================================================
using System;
using tions;
using entModel;
using ;
using stics;
using ;
using es;
using ent;
// 系统生成了与工程名相同的命名空间
namespace WebServiceDemo
{
///
/// Summary description for Service1.
///
// 所有的WEB服务都是派生于vice的。
public class Service1 : vice
{
public Service1()
{
//CODEGEN: This call is required by the Web Services Designer
InitializeComponent();
}
}
}
里面我添加了文件说明和相应的注释,接下来就是在里面编写相应的服务代码
了。这里我想先把对数据库的操作封装在同一命名空间的单独的一个类里,下面编写WEB方法时只用接调用这个类中的相应方法就可以了。下面是我写的这个类的代码:
//
-------------------------------------------------------------------------
// 构建一个新类,用于对数据的访问
//
-------------------------------------------------------------------------
public class DataAccess
{
// 连接字符串成员变量
private string m_szConn = "";
private SqlConnection m_sqlConn;
private SqlDataAdapter m_sqlDa;
// 构造函数
public DataAccess(string szConnectionString)
{
m_szConn = szConnectionString;
}
// 返回一个记录集
public DataSet GetDataset(string szCommandText)
{
DataSet sqlDs;
try
{
m_sqlConn = new SqlConnection(m_szConn);
m_();
m_sqlDa = new SqlDataAdapter(szCommandText,m_sqlConn);
sqlDs = new DataSet();
m_(sqlDs);
m_();
return sqlDs;
}
catch
{
return null;
}
}
// 重载上述方法
public DataSet GetDataset(string szCommandText, string szTableName)
{
DataSet sqlDs;
try
{
m_sqlConn = new SqlConnection(m_szConn);
m_();
m_sqlDa = new SqlDataAdapter(szCommandText,m_sqlConn);
sqlDs = new DataSet();
m_(sqlDs,szTableName);
m_();
return sqlDs;
}
catch
{
return null;
}
}
}
这些就不多说了,与创建一般的C#类是一样的。类中有三个函数,其中一个为构造函数,调用时传入连接字符串。另外两个函数都是一样的作用,返回用户需要的记录集,只不是调用时传的参数不一样,实质都是一样的。
下面就是在Service1类中添加真正用于WEB调用的代码了,这部分才是给WEB应用程序调用的东西。在编写这个类的代码之前,应该先申请一个服务命令空间,设置相应的属性,这一句可万万不能少哦,呵呵~,它告诉了WEB服务存放的路径等相关的信息。如下:
// 声明一个服务空间
[WebService(
Namespace = "localhost/WebServiceDemo/", //其实这个才是最重要的啦~,其它的都可以不要哦
Name = "Web Service Demo",
Description = "Web Service Demo"
)]
下面是Service1的代码:
public class Service1 : vice
{
public Service1()
{
//CODEGEN: This call is required by the Web Services Designer
InitializeComponent();
}
#region Component Designer generated code
//Required by the Web Services Designer
private IContainer components = null;
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
}
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
e();
}
e(disposing);
}
#endregion
// 连接字符串常量
const string szConn = "server=(local)taoyi;uid=sa;pwd=;"
+ "initial catalog=mydata;data source=taoyi";
[WebMethod]
public String About()
{
return "这是一个C#编写的Web Service演示程序!";
}
// 返回其中一个WebServiceDemo表
[WebMethod]
public DataSet GetServiceDemoTable()
{
DataSet sqlDs = new DataSet();
DataAccess dataAcc = new DataAccess(szConn);
string szSql = "Select * From WebServiceDemo";
sqlDs = aset(szSql,"Demo");
return sqlDs;
}
// 返回由用户指定的查询
[WebMethod]
public DataSet GetByUser(string szCommandText)
{
DataSet sqlDs = new DataSet();
DataAccess dataAcc = new DataAccess(szConn);
sqlDs = aset(szCommandText);
return sqlDs;
}
}
是不是很简单哦,就只这么点,呵呵~,不过也可以说明问题的了。这个类中声明了三个WEB方法,有没有发觉呢?每个方法的前面都加了[WebMethod],表示该方法为WEB方法。呵呵,如果你想要你写的函数可以让WEB应用程序调用的话,这个可不能少的啦~,不然WEB应用程序就无法调用的。
到此一个WEB服务就完成了,点击运行看看,如果没什么错的话,就会出现如下的WEB页面服务描述:
Service1
The following operations are supported. For a formal definition, please
review the Service Description.
* GetByUser
* GetServiceDemoTable
* About
.....(下面还有很多)
其中代星号的就是先前在函数前加了[WebMethod]的函数。在出现在页面中你可以单击相应的函数,然后就会跳到调用页面,你可以在相应的文本框中(如果函数有参数的话)输入相应的参数,点而调用按钮,那么就可以看到函数返回的结果了(前提是函数调用无错的话),不过全是XML格式的文本。比如我的GetServiceDemoTable函数调用的结果如下:
-
- xmlns:xs="/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - msdata:Locale="zh-CN"> - - - - -
- xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> - - -
到此为至,Web Service程序就已经算是完成了。
下面要做的是写一个WEB应用程序来测试我写的这个Web Service了,看看能不能达到想要的结果。建立Web应用程序的步骤如下:
一、新建一个 Web Application工程,与创建Web Service的第一步一样,只是工程类型不一样罢了。我这里工程名为WebServiceDemoTest,完整的为localhost/WebServiceDemoTest,系统就在相应的目录(c:InetpubwwwrootWebserviceDemoTest)下生成了所需文件。
二、在设计视图下打开文件,在里面放置一个panel容器,为了达到测试的目的,我们需要三个服务端按钮和一个服务端文本框,分别调用我们在Web Service中写的三个函数,另外,为了展示调用方法所得达的数据,还需要一个服务端标签控件和一个DataGrid控件。页面的布置就随便你了,想怎么放置就怎么放置,只要能达到演示的目的就行。
三、引用先前写的Web Service程序,菜单步骤如下project->add web
,然后输入我们Web Service的路径,这里是localhost/WebServiceDemo/,点击添加就OK了。这时你将在类视图中看到localhost命名空间了。
四、编写测试代码。
为了便于后面少写些代码,如( xx = new ()这种),那么首先你得引用localhost命名空间的service1类,以后直接写xxxx
xx = new xxxx()就可以了。
下面是几个按钮的代码:
// 测试GetServiceDemoTable()
private void Button2_Click(object sender, rgs e)
{
DataSet ds = new DataSet();
Service1 oService = new e1();
// 返回记录集
ds = viceDemoTable();
if (ds != null)
{
// 显示记录集的记录
urce = ["Demo"];
nd();
}
else
{
("加载数据错误!");
}
}
// 测试GetByUser()
private void Button1_Click(object sender, rgs e)
{
DataSet ds = new DataSet();
Service1 oService = new e1();
String szCommand = ;
ds = ser(szCommand);
if (ds != null)
{
urce = ds;
nd();
}
else
("错误!有可能是SQL命令有问题!");
}
// 测试About()
private void Button3_Click(object
sender, rgs e)
{
Service1 oService = new
e1();
=
();
}
OK,最后就是运行了,如果一切OK,点击第一个按钮得到的将是在一个包函用户执行的SQL命令的表结果。第二个按钮得到的就是上面运行Web Service时的GetServiceDemoTable得到的XML描述,即
ID szUser szSex
szAddr
1 taoyi 男 四川泸州
2 xiner 女 四川宜宾
点击第三个按钮,则在Label1中显示"这是一个C#编写的Web Service演示程序!”的字符串。
建议结合本博客中的“c# web service 事例”看
版权声明:本文标题:webservice简单实例 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703233990h443365.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论