一个webservice的初级例子

摘要:
首先,我们必须了解web服务是什么。从概念上讲,它可能更复杂,但我们可以有一个宏观的理解:web服务是一个外部接口,有一些功能可以被外部客户调用(注意:也有一些功能不能被客户调用)。如果我们是一个服务器,我们编写一个web服务,然后将其提供给客户(同时,我们给他们调用规则),客户可以以相对透明的状态从服务器获取信息。也就是说,客户不了解(也不需要)流程,他们只得到


    首先,我们必须了解什么是webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接口,里面有函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态.即是客户不了解(也不需要)其过程,他们只获取数据.
    webservice传递的数据只能是序列化的数据,典型的就是xml数据,这里我们也只讨论xml数据的传输.
   
有了一些对xml webservice的初步了解后,我们将切入正题,即是用一个具体的webservice事例的形式来讲解具体的webservice用法,用具体的事例来讲解一个概念我想怎么也要比单纯的说理能让人容易理解吧.
    这里,我们将以一个简单的分布式课件搜索系统为例来讲解.使用VS2003为编译环境,C#为语言,SqlServcer2000为数据库.(这个例子来源于一位网上朋友的文章的启发,觉得很能代表webservice的特点,就按那个想法做了这么个系统来示例了)
   
首先,明确我们要做什么.我们需要一个对客户的接口,也就是个站点,我们把它称做ServiceGatherSite,它是何种形式都无所谓,甚至它本身并不需要数据库,它只是提供给用户一个查询的接口,真正的服务,普通用户是不接触到的.然后,这里我们还需要若干个提供服务的站点,我们可以称它们为资源站,这里为简单起见,假设有两个资源站,分别叫WebSiteA,WebSiteB,它们可以是不对外公布的,只是为了丰富查询数据而存在.最后,是我们最需要关注的东西---资源站提供给ServiceGatherSite的服务.两个资源站,就有两个服务,我们称为SiteAService和 SiteBService.两个服务间没有任何关系,内部提供的方法也完全没关联,只是需要把方法如何使用告诉ServiceGatherSite,意思是,服务只提供查询接口,返回的数据如何处理,服务本身并不管,全由使用服务的站点分配.
     写了这么多,算是简要的介绍了下有关xml webservice的概念和我们这个例子的结构,下篇文章,我们将开始真正进入代码的设计阶段.
       
在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件->新建->项目->C#->Web服务应用程序)
    建完这个工程,我们将看到一个叫Service1.asmx的文件,这就是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)
  {
   DataSet dsNorthwind 
= new DataSet();
  
//Create the connection string.           
   String sConnect;
   sConnect
="Password=eaiuser;User ID=eaiuser;Data Source=eaitest";     
         
   
//Create a connection object to connect to the northwind db.
   OracleConnection nwconnect = new OracleConnection(sConnect);
    
//Create a command string to select all the customers in the WA region.
   String sCommand = "Select * from users";
    
//Create an adapter to load the DataSet.
   OracleDataAdapter myDataAdapter = new OracleDataAdapter(sCommand, nwconnect);
    
//Fill the DataSet with the selected records.
   myDataAdapter.Fill(dsNorthwind,"users");
    
//Load the document with the DataSet.
   XmlDataDocument doc = new XmlDataDocument(dsNorthwind);   
     
//Display the XmlDataDocument.
   doc.Save(Console.Out);
     
if(true//如果执行成功,存储过程
   {
    XmlNode root1
=doc.DocumentElement; 
    XmlNodeList roots
=root1.SelectNodes("list");   
    
foreach(XmlNode roota in  roots)  //为所有元素加上站点名称标记
    {
     XmlElement Link
=xd.CreateElement("SiteName"); 
     Link.InnerText
=ConfigurationSettings.AppSettings["SiteName"].ToString();
     roota.AppendChild(Link);
    }
    
return doc;
   }
   
else return null;
}
 

           这是获取资源站点信息的一个接口函数.里面大部分的代码,我想对于有一定asp.net基础的朋友来说,都应该是一看就明白,这里只说明下CStoreProc,这是我封装的一个存储过程类,主要功能是执行各种类型的存储过程.
          细心的朋友可能会发现这个函数的返回类型似乎比较特殊,是个xml的文档.我们在前面已经说过,webservice只能传输序列化数据,xml显然满足条件,但比如hash表之类的非序列化数据,是不能传输的,xml使用最为广泛,而且考虑到跨平台应用,所以这里我们只以xml数据的传输来示例.
          函数功能很简单,只是要返回查询结果,其数据格式是XmlDataDocument.当查询失败时(无匹配查询结果),我们构造一个xml,返回一个空记录.否则,我们把查询后的dataset生成一个
      好了,webservice的方法函数介绍完了(这里还有个web服务方法,稍后介绍),接下来我们的任务是怎么调用它了.首先把webservice的项目编译完成,假定我们这个服务是针对资源站点A的,我们不妨称其为ServiceA.先单独运行asmx文件,执行 GetSiteAData(string AssignName)方法,将提示你输入参数,你输入要搜索的内容,点确认,将返回给你一个xml数据,并在ie上显示出来,这就是你搜索到的内容拉.
        这里对ServiceA的工作再做点介绍,在我们这个项目里,它是资源站点A提供的服务,意思是,它查询的数据将全来源于站点A,而站点A资源添加在本项目也有专门的工程实现.
        好了,回到正题.这里我介绍vs调用webservice的方法,其实其他平台的调用方法也是大同小异.首先我们介绍web引用方式,这种方式我强烈建议调试时使用,非常方便.右击引用,点添加web引用,输入你的webservice地址,如:http://localhost/aspxproject /WebServiceSolution/SiteBService/service1.asmx,你必须保证你输入的webservice存在.然后引用即可,注意:web引用名将作为你加入的webservice的名字空间.比如你输入了:SiteA,那服务的实例化将是这样:SiteA.Service1 serviceA=new SiteA.Service1();(Service1是服务的类名).另一种引用的方法是产生一个代理类,编译成dll,在引用的地方把这个dll引用进去,不过这种方法有个缺点:就是当web服务修改了以后必须重新编译

 

通过前面的介绍,大概应该知道怎么写webservice,怎么调用,接下是讲怎么使用webservice提供的服务.下面是一段代码,比较简单:

private void button1_Click(object sender, System.EventArgs e)
  {
   
//localhost.Service1 a= new WindowsApplication1.localhost.Service1();
//   a.HelloWorld();
//   
//   d.Url = "";
//   d.GetSiteAData();
//   d.HelloWorld();
//
   string strSearch = "123";
   ServiceA.Service1 a 
= new ServiceA.Service1();
   ServiceB.Service1 b 
= new ServiceB.Service1();
   IAsyncResult ar1;
   IAsyncResult ar2;
   DataSet ds
=new DataSet();
   XmlNode xmlNode1,xmlNode2;
   XmlDataDocument xd
=new XmlDataDocument();
   StringBuilder xmlString1,xmlString2;
   
//--简单的异步调用
   ar1=a.BeginGetSiteAData(strSearch,null,null);
   ar2
=b.BeginGetSiteAData(strSearch,null,null);
   xmlNode1
=a.EndGetSiteAData(ar1);
   xmlNode2
=b.EndGetSiteAData(ar2);
   
//----------
   if(xmlNode1==null&&xmlNode2==null//--              
        return;
   xmlString1
=new StringBuilder(xmlNode1.OuterXml);
   xmlString2
=new StringBuilder(xmlNode2.OuterXml);
   xmlString1
=MakeNewXmlString(xmlString1,xmlString2);  //生成新的xml
   if(xmlString1.ToString().Equals(""))
    
return ;
   xd.LoadXml(xmlString1.ToString());
   ds.ReadXml(
new XmlNodeReader(xd));
   dataGrid1.DataSource
=ds.Tables[0]
  }
   
//生成新XML
  public StringBuilder MakeNewXmlString(StringBuilder str1,StringBuilder str2)
  {
   str1
=str1.Replace("","");
   str2
=str2.Replace("","");
   str1.Append(str2.ToString());
   
return str1;
  }

这段代码是在windows应用程序里运行的,如果是asp.net应用程序的话要改个地方:
dataGrid1.DataSource=ds.Tables[0];后面加上dataGrid1.DataBand();

免责声明:文章转载自《一个webservice的初级例子》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据结构 树记一次ORACLE的UNDO表空间爆满分析过程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SAP UI5和CRM WebUI的View和Controller是如何绑定的

UI5 例如我在UI5的界面上画一个按钮,点击之后弹出一个Alert dialog。 在XML view里只定义了controller的名称和事件处理函数的名称。那么按钮被点击之后,controller的onShowHello被触发。但是,这个controller的实例是什么时候被创建, 并且关联到这个申明它的XML view里呢? 在XMLView.j...

关于Spring IOC (DI-依赖注入)需要知道的一切

关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 《Spring入门经典》这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初学者也适合spring有过开发经...

xml解析(4)

本节要点: DOM解析方式 SAX解析方式 DOM4J对XML的解析 XML用于将数据组织起来,形成文档用于存储和传输; 更多时候我们需要的是将xml中的数据解析出来,甚至是在程序中动态生成xml。 操作xml的方式有两种DOM和SAX。 XML解析方式分为两种:DOM方式和SAX方式: DOM:Document Object Model,文档...

Spring框架系列(二)--装配和创建Bean

  企业日常开发中,几乎都是Spring系的框架,无论是SSM、还是现在大火的SpringBoot,使用最大的目的就是简化开发 基本模块: 核心容器:Beans、Core、Context、SpEL 1. core和beans模块提供了整个框架最基础的部分,包括了IoC(控制反转)和Dependency Injection(依赖注入)。 2. Contex...

四种Sandcastle方法生成c#.net帮助类帮助文档

     方法一、Visual Studio新建documentation生成帮助文档         前段时间在网上收集和自己平时工作总结整理了《干货,比较全面的c#.net公共帮助类》,整理完成上传github之后我又想,既然是帮助类,总得有个帮助文档于是乎想到了Sandcastle,Sandcastle是微软官方生成帮助文档这发面的工具。      ...

Qt 直接构建XML开发web services客户端程序

client.h client.cpp : XML发送与接收 其中 request.setHeader(QNetworkRequest::ContentTypeHeader, "text/xml;charset=utf-8" /*"application/x-www-form-urlencoded"*/); header的value值可以用soapui...