雨人,你知道Delphi怎样调用MS.net实现的Web Services吗?(100分)

  • 主题发起人 主题发起人 delphizhao
  • 开始时间 开始时间
D

delphizhao

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Delphi调用MS.net实现的Web Services老是产生(Internal Server Error(500))异常。怎么回事?
 
我想你可以看一下李维的那篇《肥皂的战争》
 
《肥皂的战争》在哪里?
 
《肥皂的战争》在哪里?
 
以前是不可以的,《肥皂的战争》也提到了,DELPHI的WEBSERVICE于MS的.NET和SOAP TOOLKIT
不兼容,不过现在好了........因为D6的UPDATE1修正了这些问题,哈哈
我已经测试过了与SOAP TOOLKIT的兼容没问题了,虽然每测试.NET的兼容性,
但是我想不会有问题了.
所以.............................赶快升级了!
 
to VoodooBoy:
我刚Down了一个Delphi 6的Update,安装后,编译一个Web Services Client程序竟然通不过?这个
程序是在Borland网站Down的。
 
在今年的《程序员》杂志中全称叫《肥皂的战争与和平》具体哪一期忘记了!
 
to delphizhao:
不会啊,我的就正确,一点问题也没有,不过csdn上有个哥们说还有一堆bug,我没研究就是了!
你重装一次d6然后再装update1再看看吧!:(
 
to VoodooBoy:
试一试这个程序http://codecentral.borland.com/codecentral/ccweb.exe/download?id=16960。
在Borland的介绍中,好像有一个WSDL Importer的东东,不知是单独的程序还是IDE的Wizard
可我的Delphi中怎么也没找到它,即使安装了Update。另外,我的Web Services Importer Wizard生成
单元时,把好多简单类型如int,Single等等都给我封装成了对象。我得承认我的Delphi是D版。
 
wsdl inporter当然有了,就在new-〉web service下面啊!
 
可以看一下下面的文章,微软自己调用自己总不会出问题吧?
--------------------------------------------------------------------

用Delphi 5创建Web Services
Lubomir Rosenstein


摘 要:用Delphi 5创建Web Services
关键字:Web services,Delphi 5
类 别:MS.NET



中文开发在线原创作品,未经允许,严禁任何形式的转载



Web Services是微软之梦。许多业界大腕开始对它感兴趣,并以极大的热情做好准备迎接新方向。在最后关头,甚至Borland也决定不置身事外。然后,在长久的沉默之后,突然抛出Delphi 6……

政治与梦想

我尚无缘得见新版本的Delphi。据可靠消息称,它提供对SOAP--Web Services的基础--的全面支持,而扔弃了Borland MIDAS。

为什么这只软件大鲨会对Web Services如此钟情?他们的动机很容易明白。Web services意味着不用再卖产品,而是卖服务。不再会有盗版。版权受到完全保护:制造商独家保有软件。和消费者签订的合同将会是长期的。而且如同上瘾一半,用户用得越多,就越是想用。对于大企业来说这就是白花花的银子、用户忠诚和集权。从坏处想,Web services也有可能使客户的交流和日常生活被主宰--新资本主义革命的混合体以及"大哥"--噩梦。

有人希望那只是刺激的白日梦。只有在未来才能看到Web services在社会中所起的作用。但无庸置疑,它们已经使业界产生了极大的改变,就像PC和Internet的出现一样。而我们,开发人员,必须做好准备。

这里有一个简单的例子--执行某个数学计算,x+y什么的。(这是一个高度抽象的例子;你可以把它投射到真实世界中)。以前,要完成这个任务,用这样的代码:

function HaveSum (x: integer; y: integer): integer;
begin
Result:=x+y;
End;

后来,人们发明了OOP(面向对象编程)。于是我们就有了一个包括两个整数值和一个GetSum方法的ThaveSum类,然后用它创建一个对象实例。在设计层面上,这显得既雅致又高效(此出就不再继续讨论OOP的好处了)。跟着是微软的COM。对象不再只是被创建,更是一个生命体。程序设计变成协调所有这些生命体,完成某种任务,而非单纯做一个工匠的工作。

问题在于这些生命体并非都易于伺候,但Microsoft Office仍然实现了这一策略。理论上COM被设计为可以接收远程调用,如果一个办公室里有20个用户想知道x+y到底等于几,我们就只需要创建一个IhaveSum COM,然后分发、销售、回答所有这些用户的问题。

现在,Web services之梦来了:不分发产品,而是分发服务。如果谁要求服务,就要呼叫分发者执行,并且为服务付钱。软件用户与软件产品完全隔绝,他只关心产品给出的结果(而那就是在已然过去了的"黄金时代"里,购买或合法拷贝的真正原因)。


简单的Delphi 5例子

Web services的两大柱石--HTTP和XML已经为Delphi开发者所熟知了。下面我想展示用Delphi 5来实现Web services。希望Delphi 6的例子很快就可以给出。

首先我要实现HTTP协议。服务器可以是ASP或PHP页面。既然我们用Delphi,那就用Delphi CGI stand-alone可执行文件做服务器。只需要几分钟时间、一行代码就可以完成(我在解释给菜鸟听呢)。

选择 File(文件)- New(新建)- New Web Server Application(新Web服务器应用程序)。我们要做的事用CGI就可以了,而且便于调试。在真实环境中用ISAPI DLL会好些。于是我们得到一个WebModule。打开它的Action Editior,在OnAction事件中加入下面的代码:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
Response.Content :=IntToStr( StrToIntDef(Request.QueryFields.Values['x'],0) +
StrToIntDef(Request.QueryFields.Values['y'],0));
end;

服务器计算两个变量之和,然后传送到客户端。

在Delphi中可以有多种方法实现HTTP协议。可以用WinInet API函数(在Marco Cantu的《精通Delphi 5》中有很好的例子)或者Indy组件(在Delphi 6中应该整合了Indy,也可以在http://www.nevrona.com/Indy下载。这里我打算用Microsoft Internet Transfer Control 6.0,所以你需要在Delphi中Import类型库MSINET.OCX。在INET98.CHM帮助文件里面可以找到更多信息。这个控件用起来很简单,在我们的例子中也只需要一行代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption :=
inet1.OpenURL('http://localhost/scripts/webcalc.exe?x='+Edit1.Text+'&y='
+Edit2.Text);
end;

控件向服务器发送请求,并且接收回答。OnStateChange事件允许我们得到操作的详细信息:

procedure TForm1.Inet1StateChanged(Sender: TObject; State: Smallint);
begin
case state of
icResolvingHost: statusbar1.Panels[0].Text :=
('寻找指定服务器的IP地址。');
icHostResolved: statusbar1.Panels[0].Text :=
(' 成功找到IP地址。');
icConnecting: statusbar1.Panels[0].Text :=
(' 正在连接到主机。');
icConnected: statusbar1.Panels[0].Text :=
(' 成功连接到主机。');
icRequesting: statusbar1.Panels[0].Text :=
(' 发送请求。');
icRequestSent: statusbar1.Panels[0].Text :=
(' 成功发送请求。');
icReceivingResponse: statusbar1.Panels[0].Text :=
('接收主机回应。');
icResponseReceived: statusbar1.Panels[0].Text :=
(' 成功接收到主机回应。');
icDisconnecting: statusbar1.Panels[0].Text :=
(' 从服务器断开。');
icDisconnected: statusbar1.Panels[0].Text :=
('成功从服务器断开。');
icError: statusbar1.Panels[0].Text :=
('与服务器通讯发生错误。');
icResponseCompleted: statusbar1.Panels[0].Text :=
('The request has completed and all data has been received');
end;
end;


图一:客户端

客户端应用程序做好了。它不自己做计算工作,而是依靠Webcalculator服务器完成任务。我们的Web services可以为任何人提供服务……下一个例子稍微高级些:使用XML传递变量。XML连初学者也应该掌握,它不过是储存和交换数据的一种标准格式而已。这回我用TNMHTTP的Post方法(在Delphi的FastNet控件组):

Web.Post('http://localhost/scripts/webCalc.exe',' '+strX+'+strY+');

这个命令做了所有工作,不同之处在于它用来传递结构化了的XML文档。服务器需要解析XML。这是我们需要另一种技术:Charlie Calvert在《Delphi中的XML解析》种作了详细说明。我将用MSXML.DLL库来做服务器端XML解析。你需要import这个Microsoft库到Delphi中。同样,在OnAction事件中加入代码:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean(;
var
doc : IXMLDOMDocument;
ElemList: IXMLDOMNodeList;
x, y:integer;
begin
Doc:= CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
Doc.loadXML (Request.ContentFields.Text );
ElemList:= Doc.getElementsByTagName ('varX'):
x:= StrtoIntDef(ElemList.item[0].text,0);
ElemList:= Doc.getElementsByTagName ('varY);
y:= StrtoIntDef(ElemList.item[0].text,0);
Response.content:= #10+#13+InttoStr(x+y) ;
end;

可以用多种方法来读取XML文档。Microsoft XML SDK中有很好的文档。服务器做好了。XML被用来传递变量,而不只是x和y这么简单。


DELPHI 5 与 SOAP 例子

不用等Delphi 6,我们可以马上开始用SOAP工作。可以下载SOAP Toolkit 2.0,在Delphi 5中创建Web service。在最后一个例子中,我们用它来实现Webcalculator。

第一步,创建一个提供服务的COM对象。然后,构造一个WSDL(Web Service Description Language,Web服务描述语言)文件,用于Web services。幸运的是我们可以用SOAP Toolkit 2.0自动创建这些文件。最后一步,开发一个Delphi应用程序,它将使用服务。这样,我们要通过Delphi控制SOAP客户端。

开始。第一个任务是创建简单的COM对象。它只有一个接口和一个方法:GetSum。

ISummer = interface(Idispatch)
function GetSum(const x: WideString; const y: WideString): WideString;
safecall;

function TSummer.GetSum(const x, y: WideString): WideString;
begin
Result:= InttoStr(SysUtils.StrtoInt(x)+ SysUtils.StrtoInt(y);
end;

{和前一个例子差不多,是吧?像做一个Active Server Object一样。用Delphi写简单ASP的方法。编译为ActiveX Dll,发布到ASP文件:}

Set DelphiASPObj = Server.CreateObject("Project1.Summer")
Response.Write ( DelphiASPObj.GetSum(Request.QueryString.Item("x"),
Request.QueryString.Item("y")))
Set DelphiASPObj = Nothing
Response.End


图二 我们的COM Webcalculator,提供Web service

如果不出意外的话,计算机可以开始工作了。在浏览器中输入http://localhost/scripts/webcalculator.asp?x=3&y=8之类的地址,应该返回答案了。

接下来,安装SOAP Toolkit。下载地址:Microsoft - msdn-files/027/001/580/msdncompositedoc.xml。然后,从Toolkit菜单中选择WSDL生成器(generator)。输入服务名,ActiveX Dll的名称,还有生成WSDL、WSML的web目录。

最后,用三行代码创建客户端:

procedure TForm1.Button1Click(Sender: Tobject);

var
SoapClient: OleVariant;
SoapClient := CreateOleObject('MSSOAP.SoapClient');
begin
SoapClient.mssoapinit('http://localhost/scripts/sumservice.wsdl','SumService','SummerSoapPort');
showmessage(SoapClient.GetSum(Edit1.Text,Edit2.Text));
end;

搞掂啦。恭喜恭喜!我们拥有了自己的SOAP Webcalculator!

很容易把这个例子移植到真实软件环境:比如,一个web service,用来储存客户地址簿。

用Delphi 5、HTTP和XML就可以创建Web services。Import微软Simple Object Access Protocol(SOAP)Toolkit 2.0,使得这一切成为可能。下一版本的Delphi承诺百分之百支持SOAP,并能用这种新工具实现Web services。我们正在进入Web services时代,有一样是可以确定的:它将使我们--程序员--的生活更加兴奋。

 
后退
顶部