webservice实例()
qq群:19877329
By: jfan 2007-07-23
上篇文章介绍了些webservice的基本特性和我们例子的结构,这篇文章我们将开始具体的代码编写工作.
     这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:usewebservice只作简略介绍.
      VS2005,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件->新建->网站->ASP.NET WEB服务)
      建完这个工程,我们将看到一个叫Service.asmx的文件,这就是webservice的标准文件,它也有UI的概念,不过我们一般不关注,因此,我们查看其cs代码文件.如果你什么都还没做的话,将看见一个被注释掉的helloworldWebMethod,把注释去掉,在运行,你就可以得到最简单的webservice运行实例了.点击"helloworld"将执行其方法.显然,这个函数对我们的意义只在于宏观的了解了下web服务的写法.
     下面,我们将开始具体介绍webservice的写法.在代码文件里,如果我们写了一个函数后,希望此函数成为外部可调用的接口函数,我们必须在函数上面添上一行代码[WebMethod(Description="函数的描述信息")],如果你的函数没有这个申明,它将不能被用户引用.:
[WebMethod(Description="最简单的方法")]
  public string HelloWorld()
  {
   return "Hello World";
  }
     这个函数就是外部可调用的接口函数,对用户来说相当于一个API.如果某用户在引用了这个服务后,他调用HelloWorld()方法,他就将获得"HelloWorld"这个返回值.
API (Application Programming Interface)
所谓API本来是为CC++程序员写的。API说来说去,就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中。用标准的定义来讲,API就是Windows32位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在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占的作用之重,谁都知道的.其他的请朋友们先看(呵呵,个中高手就免了)