以前没有弄过wevservice 现在业务需要 所以临时抱佛脚的去网一看了看 wevservice 的用法 不过还有一系列的问题要请教大家,先谢谢了1.怎么返回一个xml数据:[WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }原始显示
<?xml version="1.0" encoding="utf-8" ?> 
  <string xmlns="http://test.org/">Hello World</string> 
我想要的显示<?xml version="1.0" encoding="utf-8"?>
<test xmlns="http://test.org/">
<HelloWorld>Hello World</HelloWorld><!--这儿的节点名不一定要用方法名-->
<appedString>just a test</appedString><!--这儿不一定会出现或出现更多节点-->
</test><!--另一个就是加上数据类型(非必要)--><?xml version="1.0" encoding="utf-8"?>
<test xmlns="http://test.org/">
<HelloWorld dataType="string">Hello World</HelloWorld>
<appedString>just a test</appedString>
</test>
 
2.异常的处理:
就是在错误或逻辑错误的时候我怎么自己定义返回一个字符串或xml.如:
字符串:
字符错误xml:<?xml version="1.0" encoding="utf-8"?>
<test xmlns="http://test.org/">
<exCode>4</exCode>
<exName>字符错误</exName>
</test>3.当我需要用这个webservice写入列表数据时怎么传进来,如:
领料表
id 物料名称 数量
1  a        10
2  b        20
3  c        10

解决方案 »

  1.   

    把数据返回成一个DataSet,然后调用DataSet的GetXml方法即可得到XML的格式
      

  2.   

    你是说的第3个吗?可那是由客户端调用时的,客户端不一定用.net的哦
      

  3.   

    学webservice ,一定要看soap ,msdn 上有
      

  4.   

    DataSet会自动序列化为xml格式的流.
      

  5.   

    id 物料名称 数量 
    1  a        10 
    2  b        20 
    3  c        10 
    ===============
    存放在DataTable内,再加入DataSet,在客户端将DataSet转换为byte[]数组,WebService后台还原,搞定!不要转换XML,太复杂C# 常用函数库 - 对象转换-压缩解压object为byte数组 
    http://www.vjsdn.com/bbs/bbsTopicDetails.aspx?pid=140俺是这么做的!
      

  6.   


    把WEBSERVICE直接换成HTTPHANDLER,要什么样子的XML直接Write到流里就完事。呵呵!
      

  7.   


    我们新建一个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) 
      { 
      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=""; 
      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数据的传输来示例.
      接上篇文章,我们先简单解释下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地址,如:http: //localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必须保证你输入的webservice存在.然后引用即可,注意:web引用名将作为你加入的webservice的名字空间.比如你输入了:SiteA, 那服务的实例化将是这样:SiteA.Service1 serviceA=new SiteA.Service1();(Service1是服务的类名).
      完成了这一步,service的调用似乎变的那么简单,我们已经实现了远程实例化,接下来的远程调用也是一样的容易.下面给出资源采集站ServiceGatherSite的绑定代码(只采集A站点的信息)以下是引用片段:
      //绑定数据 
      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("")) 
      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,这是通用的方法,如果是刚接触不久的朋友,最好能记下这种方法.
      接下来给出异步调用两个服务的代码以下是引用片段:
      //绑定数据 
      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("")) 
      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("",""); 
      str2=str2.Replace("",""); 
      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就可以了.