基于.NET的WebService的实现

这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只将简略介绍.

     在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件->新建->项目->C#->Web服务应用程序)

     建完这个工程,我们将看到一个叫Service1.asmx的文件,这就是webservice的标准文件,它也有UI的概念,不过我们一般不关注,因此,我们查看其cs代码文件.如果你什么都还没做的话,将看见一个被注释掉的helloworld的WebMethod,把注释去掉,在运行,你就可以得到最简单的webservice运行实例了.点击"helloworld"将执行其方法.显然,这个函数对我们的意义只在于宏观的了解了下web服务的写法.

     下面,我们将开始具体介绍webservice的写法.在代码文件里,如果我们写了一个函数后,希望此函数成为外部可调用的接口函数,我们必须在函数上面添上一行代码[WebMethod(Description="函数的描述信息")],如果你的函数没有这个申明,它将不能被用户引用.如:

view plaincopy to clipboardprint?

  1. [WebMethod(Description="最简单的方法")]  
  2.   public
    string HelloWorld()  
  3.   {  
  4.    return
    "Hello World";  
  5.   }   

[WebMethod(Description="最简单的方法")]
public string HelloWorld()
{
return "Hello World";
}

     这个函数就是外部可调用的接口函数,对用户来说相当于一个API.如果某用户在引用了这个服务后,他调用HelloWorld()方法,他就将获得"HelloWorld"这个返回值.

      看到这里,我们是不是发现,其实webservice并不是那么的神秘,它也不过只是个接口,对我们而言,侧重点依然是接口函数的编写.下面,我将给出我们的例子所需要的接口函数.

view plaincopy to clipboardprint?

  1. [WebMethod(Description="查询以获取需要的课件信息")]  
  2. public XmlDataDocument GetSiteAData(string AssignName)  
  3. {  
  4.   XmlDataDocument xd=new XmlDataDocument();
    //  
  5.   DataSet ds=new DataSet();  
  6.   CStoreProc cp=new CStoreProc("SearchAssign");  
  7.   cp.AddParIn("@keywords",SqlDbType.VarChar,30,AssignName);  
  8.   cp.AddParOut("@res",SqlDbType.Int);  
  9.   if(cp.SelectProc())
    //如果执行成功,存储过程  
  10.   {  
  11.    cp.myData.EnforceConstraints=false;
    //不进行格式严格检查  
  12.    if((int)cp.GetReturnValue("@res")==-1)  
  13.    {  
  14.     string xml="<NewDataSet></NewDataSet>";  
  15.     xd.LoadXml(xml);  
  16.     return xd;  
  17.    }  
  18.    xd=new XmlDataDocument(cp.myData);  
  19.    XmlNode root1=xd.DocumentElement;   
  20.    XmlNodeList roots=root1.SelectNodes("list");     
  21.    foreach(XmlNode roota
    in  roots) 
    //为所有元素加上站点名称标记  
  22.   {  
  23.     XmlElement Link=xd.CreateElement("SiteName");   
  24.     Link.InnerText=ConfigurationSettings.AppSettings["SiteName"].ToString();  
  25.     roota.AppendChild(Link);  
  26.  
  27.    }  
  28.    return xd;  
  29.   }  
  30.   else
    return null;  
  31. }   

[WebMethod(Description="查询以获取需要的课件信息")]
public XmlDataDocument GetSiteAData(string AssignName)
{
XmlDataDocument xd=new XmlDataDocument(); //
DataSet ds=new DataSet();
CStoreProc cp=new CStoreProc("SearchAssign");
cp.AddParIn("@keywords",SqlDbType.VarChar,30,AssignName);
cp.AddParOut("@res",SqlDbType.Int);
if(cp.SelectProc()) //如果执行成功,存储过程
{
cp.myData.EnforceConstraints=false; //不进行格式严格检查
if((int)cp.GetReturnValue("@res")==-1)
{
string xml="<NewDataSet></NewDataSet>";
xd.LoadXml(xml);
return xd;
}
xd=new XmlDataDocument(cp.myData);
XmlNode root1=xd.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 xd;
}
else return null;
}

这是获取资源站点信息的一个接口函数.里面大部分的代码,我想对于有一定asp.net基础的朋友来说,都应该是一看就明白,这里只说明下CStoreProc,这是我封装的一个存储过程类,主要功能是执行各种类型的存储过程.

        细心的朋友可能会发现这个函数的返回类型似乎比较特殊,是个xml的文档.我们在前面已经说过,webservice只能传输序列化数据,xml显然满足条件,但比如hash表之类的非序列化数据,是不能传输的,xml使用最为广泛,而且考虑到跨平台应用,所以这里我们只以xml数据的传输来示例.

函数功能很简单,只是要返回查询结果,其数据格式是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地址,如:http://localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必须保证你输入的webservice存在.然后引用即可,注意:web引用名将作为你加入的webservice的名字空间.比如你输入了:SiteA,那服务的实例化将是这样:SiteA.Service1
serviceA=new SiteA.Service1();(Service1是服务的类名).

       完成了这一步,service的调用似乎变的那么简单,我们已经实现了远程实例化,接下来的远程调用也是一样的容易.下面给出资源采集站ServiceGatherSite的绑定代码(只采集A站点的信息)

view plaincopy to clipboardprint?

  1. //绑定数据  
  2.   public
    void BindData()  
  3.   {  
  4.    serviceA=new SiteA.Service1();  
  5.    DataSet ds=new DataSet();  
  6.    XmlNode xmlNode1;  
  7.    XmlDataDocument xd=new XmlDataDocument();  
  8.    StringBuilder xmlString1;  
  9.    xmlNode1=serviceA.GetSiteAData(strSearch);  
  10.    if(xmlNode1==null)
    //--存储过程执行失败  
  11.     return;  
  12.  
  13.    xmlString1=new StringBuilder(xmlNode1.OuterXml);  
  14.    if(xmlString1.ToString().Equals("<NewDataSet xmlns=\"\"></NewDataSet>"))  
  15.     return ;  
  16.    xd.LoadXml(xmlString1.ToString());  
  17.    ds.ReadXml(new XmlNodeReader(xd));  
  18.    DataGrid1.DataSource=ds.Tables["list"].DefaultView;  
  19.    DataGrid1.DataBind();  
  20.   }  

//绑定数据
public void BindData()
{
serviceA=new SiteA.Service1();
DataSet ds=new DataSet();
XmlNode xmlNode1;
XmlDataDocument xd=new XmlDataDocument();
StringBuilder xmlString1;
xmlNode1=serviceA.GetSiteAData(strSearch);
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));
DataGrid1.DataSource=ds.Tables["list"].DefaultView;
DataGrid1.DataBind();
}

       此段代码给出了xml转化成dataset的解决方案,虽然这不是必须的,但毕竟在asp.net里,dataset占的作用之重,谁都知道的.其他的请朋友们先看(呵呵,个中高手就免了)

先简单说明下绑定函数.首先实例化ServiceA,这个和一般类的实例化并没有不同..接下来用xmlNode1来接受函数的返回值,接下来是构造xml,并将其转化为dataset,这是通用的方法,如果是刚接触不久的朋友,最好能记下这种方法.

     接下来给出异步调用两个服务的代码

view plaincopy to clipboardprint?

  1. //绑定数据  
  2.   public
    void BindData()  
  3.   {  
  4.    IAsyncResult ar1;  
  5.    IAsyncResult ar2;  
  6.    serviceA=new SiteA.Service1();  
  7.    serviceB=new SiteB.Service1();  
  8.    DataSet ds=new DataSet();  
  9.    XmlNode xmlNode1,xmlNode2;  
  10.    XmlDataDocument xd=new XmlDataDocument();  
  11.    StringBuilder xmlString1,xmlString2;  
  12.    //--简单的异步调用  
  13.    ar1=serviceA.BeginGetSiteAData(strSearch,null,null);  
  14.    ar2=serviceB.BeginGetSiteAData(strSearch,null,null);  
  15.    xmlNode1=serviceA.EndGetSiteAData(ar1);  
  16.    xmlNode2=serviceB.EndGetSiteAData(ar2);  
  17.    //----------
     
  18.    if(xmlNode1==null&&xmlNode2==null)
    //--存储过程执行失败  
  19.     return;  
  20.  
  21.    xmlString1=new StringBuilder(xmlNode1.OuterXml);  
  22.    xmlString2=new StringBuilder(xmlNode2.OuterXml);  
  23.    xmlString1=MakeNewXmlString(xmlString1,xmlString2); 
    //生成新的xml  
  24.    if(xmlString1.ToString().Equals("<NewDataSet xmlns=\"\"></NewDataSet>"))  
  25.     return ;  
  26.    xd.LoadXml(xmlString1.ToString());  
  27.    ds.ReadXml(new XmlNodeReader(xd));  
  28.    DataGrid1.DataSource=ds.Tables["list"].DefaultView;  
  29.    DataGrid1.DataBind();  
  30.   }  
  31.  
  32.   //生成新XML  
  33.   public StringBuilder MakeNewXmlString(StringBuilder str1,StringBuilder str2)  
  34.   {  
  35.    str1=str1.Replace("</NewDataSet>","");  
  36.    str2=str2.Replace("<NewDataSet xmlns=\"\">","");  
  37.    str1.Append(str2.ToString());  
  38.    return str1;  
  39.   }  

//绑定数据
public void BindData()
{
IAsyncResult ar1;
IAsyncResult ar2;
serviceA=new SiteA.Service1();
serviceB=new SiteB.Service1();
DataSet ds=new DataSet();
XmlNode xmlNode1,xmlNode2;
XmlDataDocument xd=new XmlDataDocument();
StringBuilder xmlString1,xmlString2;
//--简单的异步调用
ar1=serviceA.BeginGetSiteAData(strSearch,null,null);
ar2=serviceB.BeginGetSiteAData(strSearch,null,null);
xmlNode1=serviceA.EndGetSiteAData(ar1);
xmlNode2=serviceB.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("<NewDataSet xmlns=\"\"></NewDataSet>"))
return ;
xd.LoadXml(xmlString1.ToString());
ds.ReadXml(new XmlNodeReader(xd));
DataGrid1.DataSource=ds.Tables["list"].DefaultView;
DataGrid1.DataBind();
}
//生成新XML
public StringBuilder MakeNewXmlString(StringBuilder str1,StringBuilder str2)
{
str1=str1.Replace("</NewDataSet>","");
str2=str2.Replace("<NewDataSet xmlns=\"\">","");
str1.Append(str2.ToString());
return str1;
}

   这有两个需要注意的地方,一个是xml构造,还有就是异步调用的实现,请读者,自己理解

   下面讲下通过dll来引用webservice的方法,我只把流程介绍下.

   首先,在ie输入服务的地址,如:http://www.xxx.com/service.asmx

  然后写输入http://www.xxx.com/service.asmx?wsdl

  打开后,另存为xxx.wsdl

  然后用vs的命令提示符来编译:wsdl /namespace:SiteA ServiceA.wsdl

生成名字空间为sitea的代理类

最后csc /out:ServiceA.dll /t:library Service1.cs ,其中service1.cs为代理类文件

最后引用dll就可以了.

到这里,我们的例子基本也就介绍完了,由于个人的原因,最后一篇可能写的比较仓促,非常惭愧.

不知道写这么多,对学习中的朋友会不会有帮助,里面的东西,很多也算是个人理解,如果出错,还请各位海涵:)

时间: 2024-09-12 16:40:23

基于.NET的WebService的实现的相关文章

ASP.NET中基于soaphead的webservice安全机制_实用技巧

使用soaphead方法可以在webservice的请求中增加头部信息,当有人调用我们的webservice时,可以通过查询这个请求的头部信息并验证来防止该软件以外的程序调用webservice 一.服务端部分 using System; using System.Web.Services; using System.Web.Services.Protocols; //请注意此命名空间必须有别于代理动态连接库上的命名空间. //否则,将产生诸如多处定义AuthHeader这样的错误. names

开发基于ASP.NET WebService的图片验证码服务

asp.net|web|验证码     最近,工作中接到一项任务,开发一个页面验证码功能,查阅了一些网上的资料,并结合以前的绘图方面的知识,实现了如下的解决方案.生成的验证码效果如图: 要解决的问题: 1. 如何随机生成图片     生成System.Drawing.Bitmap对象,使用System.Drawing.Graphics向位图对象中绘图. 2. 如何在WebService的方法中通过参数传递图片数据     将Bitmap对象输出成字节流,WebMothod使用字节数组返回该字节流

关于利用myeclipse开发基于xfire的webservice

http://blog.csdn.net/peirenlei/article/details/1774523

MyEclipse6.5上基于XFire开发Webservice

http://kb.cnblogs.com/a/1548471/   创建并发布服务器端 1.新建WEB SERVICES PORJECT(创建web服务)此时查看services.xml内容如下: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://xfire.codehaus.org/config/1.0"> </beans> 2.编写服务器

C#调用WebService使用SSL连接

  public void SSLLearning() { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((a, b, c, d) => { return true; }); SSLWebService sws = new SSLWebService(); cws.ClientCertificates.Add( X509Certificate.Cr

jax-ws之webservice security(安全)教程第一天

前言: 在前面的"5天学会jaxws-webservice教程",我们讲了基本的jax-ws的使用. Jax-ws是业界公认的标准的webservice,它已经成为了一个行业界标准,包括cxf,其实cxf也是调用的jax-ws为标准的基于spring的webservice框架. 同时,大家都知道世界上除了j2ee体系外,还存在.net体系,同时有过相关经验的同事们也知道用ws-security无非就是涉及到"加密","解密",而JAVA的x509

客户端使用何种方式调用webservice服务?

问题描述 知道了wsdl地址,因为参数都是基本类型,所以使用javax.xml.soap 包下的api自己发送SOAP消息,解析响应数据 .但速度是相当的慢!!如果使用xfire或axis2等webservice框架效率会不会有所提升?有没有不是基于XML实现的.效率比较高的webservice调用方式?各位前辈提提意见,小子先行谢过 问题补充:elicer 写道 解决方案 引用谢谢你的回答,有种恍然大悟的感觉!不过因为对Hessian 不熟,找了点资料说:服务器端必须具备以下几点: ·包含He

从零开始学习 webservice第一集,java webservice简单实例入门教程

现在从零开始学习webservice 概念自己百度搜,总之,webservice就相当于一个接口,就像你走进了一家售货店,你不需要知道这家店怎么卖给你东西,你拿着钱去,说我要一包玉溪,人家就会给你返回一包玉溪烟,这就是webservice.不用关心掏的钱是人民币还是欠条. 首先,安装或者升级你的jdk到jre-6u20-windows-i586.exe  不要小看了本句话. 下载地址 http://10.10.4.10/download/30096685/37849757/4/zip/148/7

web service-关于axis发布webservice

问题描述 关于axis发布webservice 基于axis的webservice必须创建在网上下载的axis项目中吗,如果不是,应该怎么配置? 还有server-config.wsdd必须由deploy.wsdd生成吗,可以手动创建吗? 解决方案 http://www.cnblogs.com/javawebsoa/archive/2013/05/19/3087234.html 解决方案二: [java] view plaincopyprint? package mule.webservice.