北方站长站
客服热线:0632-5117766

关于C#下写的Web Service 服务在Delphi下调用时的问题

[2007-11-28 00:00:00] 作者:Northz.com 来源:北方站长站

Tags:下调 问题 服务 关于 我们 需要 这个 属性 一个 Money

  

使用DCom、CORBA等二进制机制的东西已经行不通了,姑且不说他们受各自平台的限制,比如DCom(Distribute Common Objects Model)只能在Windows平台下进行,而CORBA(Common Objects Request Broker Architecture)又只是Java平台下的产物。他们要实现应用程序之间的数据通信是比较困难的。

        在这种背景下,Web Services 应运而生,它很好的解决了跨语言、跨平台以及良好而安全的穿透企业防火墙。它的体系结构大体上分为五个层次:

HTTP(HyperText Transfer Protocol)信道下进行数据通信6yv北方站长站
XML(Extensable Markup Language)数据表达形式6yv北方站长站
SOAP(Simple Objects Access Protocol)的数据封装6yv北方站长站
WSDL(WebServices Description Language)的描述语言格式6yv北方站长站
UDDI(Universal Description and Discovery Integration) 统一的描述、发现和集成6yv北方站长站
        作为它的优点跨语言、跨平台以及良好而安全的穿透企业防火墙已经足以使我们感到兴奋了。不过它也存在需要改善的地方,比如:

HTTP进行数据通信存在速度较慢的情况,尤其是第一次联结。6yv北方站长站
需要一台Web Server这一额外的开销6yv北方站长站
      说了WebServices的体系结构以及其优点缺点以后我们切入正题,那就是我们这次讨论的话题:

      Web Service 服务在Delphi下调用时的问题

     闲话少说,我们用一个检验WebMethod的Attribute的一个简单的例子进行阐述:它是完成一次从客户A转帐到B的一个简单商务过程。

     首先我们在.NET FrameWork1.1下创建一个WebService,这时候.net会帮我们自动创建一个Web应用

     我们需要创建一个类AttributeTest,它是在命名空间NameSpace AttributeTesting下的,那么这个类它将自动继承了它的基类 System.Web.Services.WebService,需要支出的时,我们可以对这个Web应用类设置其WebServiceAttribute,其中基本属性包括Description 和NameSpace

[WebServiceAttribute(Namespace="http://www.isdoo.com/services",

                                       Description="Hello Ansel,This is a testing Web Service!")]

public class AttributeTest : System.Web.Services.WebService6yv北方站长站
 {

  [WebMethodAttribute(Description="描述信息:继承了Count方法,并且对名称进行重载。执行的是把钱从A用户转帐到B用户......",6yv北方站长站
       //MessageName="Changing MessageName",6yv北方站长站
       BufferResponse=true,6yv北方站长站
       CacheDuration=1000,6yv北方站长站
       EnableSession=true,                   6yv北方站长站
       TransactionOption=TransactionOption.RequiresNew)]6yv北方站长站
  public string transMoney(double Money)6yv北方站长站
  {   6yv北方站长站
   try6yv北方站长站
   {    6yv北方站长站
    ContextUtil.EnableCommit();//Transaction only used to Database operation!6yv北方站长站
    MoneyInToA(Money);6yv北方站长站
    MoneyOutFromB(Money);6yv北方站长站
    ContextUtil.SetComplete();6yv北方站长站
    return "Transaction Successful,total "+Money.ToString();6yv北方站长站
   }6yv北方站长站
   catch( Exception e)6yv北方站长站
   {6yv北方站长站
    ContextUtil.SetAbort();6yv北方站长站
    return "Transaction failed! /n/r "+e.Message;6yv北方站长站
   }   6yv北方站长站
  }6yv北方站长站
  private void MoneyInToA(double Money)6yv北方站长站
  {6yv北方站长站
      SqlCommand sqlCom = new SqlCommand("update budget set Money=Money+"+Money.ToString()+" where Name='A'");6yv北方站长站
   databaseAccess myDatabase = new databaseAccess();6yv北方站长站
   sqlCom.Connection=myDatabase.getConnection();6yv北方站长站
   sqlCom.Connection.Open();6yv北方站长站
   sqlCom.ExecuteNonQuery();6yv北方站长站
   sqlCom.Connection.Close();6yv北方站长站
   //throw new Exception("Operation failed when transfer money into A!");6yv北方站长站
  }

  private void MoneyOutFromB(double Money)6yv北方站长站
  {6yv北方站长站
   SqlCommand sqlCom = new SqlCommand("update budget set Money=Money-"+Money.ToString()+" where Name='B'");6yv北方站长站
   databaseAccess myDatabase = new databaseAccess();6yv北方站长站
   sqlCom.Connection=myDatabase.getConnection();   6yv北方站长站
   sqlCom.Connection.Open();6yv北方站长站
   sqlCom.ExecuteNonQuery();6yv北方站长站
   sqlCom.Connection.Close();6yv北方站长站
   //throw new Exception("Operation failed when transfer money from B!");6yv北方站长站
  }

}

其中我们需要特别注意的是,WebMethodAttribute,这也是我们这一次需要讲述的重点内容,只要给一个方法加上[WebMethodAttribute],哪怕里面没有任何属性,那么WebService就会把这个方法暴露(Expose)给了客户段调用者.下面我们讲述一下它的6个属性,其中包括2个描述性的信息属性,4个功能属性

描述性的信息属性:

Description6yv北方站长站
MessageName6yv北方站长站
4个功能性属性:

BufferResponse6yv北方站长站
CacheDuration6yv北方站长站
EnableSession6yv北方站长站
TransactionOption6yv北方站长站
其中我们需要注意MessageName这个属性它Delphi调用.NET平台下开发的WebService的时候,如果你设置了MessageName这个Attribute的话,那么客户端调用时会报错误。这也许是一个Bug,或许后面的版本会解决这个问题。至于这几个属性的具体功能就不再这里详细描述了。大家可以去看看相关的书籍。

下面我把Delphi调用webservice的步骤列举一下:

首先如果你只是开发调用客户端,那么你只需要创建一个普通的应用程序即可,然后需要你做的是,在工具栏WebServices下面找到SOAPHTTPClient这个控件,然后把它放在你的客户端应用窗体上;

其次就是你需要设置这个SOAPHTTPClient的属性URL或者WSDL,这个内容就是你的WebService的服务地址

比如我们当前例子的服务地址是:http://localhost/AttributeTesting/AttributeTesting.asmx

如果你想输入WSDL那么就是http://localhost/AttributeTesting/AttributeTesting.asmx?wsdl

这样就完成了控件设置;

然后我们需要引入服务器端的WSDL,你可以手工来做,也可以用Delphi提供的WebServices Importer功能来引入。

最后你只需要对引入的WSDL的接口进行调用即可。在这里我们的对应代码是:

procedure TForm1.BitBtn1Click(Sender: TObject);6yv北方站长站
var6yv北方站长站
  aa:AttributeTestSoap;//这个就是WSDL下的类接口对象6yv北方站长站
  msg:widestring;6yv北方站长站
  bb:double;6yv北方站长站
begin6yv北方站长站
  //HTTPRIO2 其实就是所谓的代理类,它负责进行数据传输发送Request和接受Response的6yv北方站长站
  aa:=HTTPRIO2 as AttributeTestSoap;

  bb:=100.00;6yv北方站长站
  msg:=aa.transMoney(bb);//这就是调用web服务所暴露给我们的web服务方法WebMethod6yv北方站长站
  showmessage(msg);6yv北方站长站
end;

6yv北方站长站
Ok! That's all!

6yv北方站长站
 

6yv北方站长站

 

News

 

info

 

down

出售手机裁听器,手机跟踪定位系统    企业网站,网城,购物网,都市导购,校园网    网上书店系统    上海电信机房服务器托管,双线主机托管    美女图片馆    15G 高清晰图片资源 无水印    室内装潢材料新产品杰威尔艺术漆    收一万ip的美女图片    大量收购个人网址导航网站    出售网址站PR=4alexa=119,764    

下一篇链接:Oralce 调用Delphi写DLL去访问C# WebService的问题

上一篇链接:怎样在C#中调用Delphi6写的DLL

评论】 【打印】 【加入收藏】 【关闭→论坛 →博客 →数据中心

 共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面