[Delphi]用Delphi7访问.NET 2.0的WebService
2006-12-29 09:43
363 查看
用VS.NET 2003开发的基于.NET 1.1的WebService,可以用Delphi7正确调用。但同样的方法调用VS.NET 2005开发的基于.NET 2.0的WebService时却发生了错误。查阅资料 http://www.community.borland.com/article/borcon/files/4132/paper/4132.html 发现原来Delphi7客户端虽然支持WebService的RPC|Encoded 和 Document|Literal编码,但 默认的是使用RPC。而.NET 2.0下的WebService却是默认采用Documnet|Literal编码的。因此我们需要显示地声明让Delphi客户端采用Documnet|Literal编码就可以了。在Delphi的WSDL Importer产生了WebService的接口文件中加入如下行:
initialization
InvRegistry.RegisterInterface(TypeInfo(ServiceSoap), 'http://tempuri.org/', 'utf-8');
InvRegistry.RegisterInvokableClass(ServiceSoapImpl);
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ServiceSoap), 'http://tempuri.org/HelloWorld');
InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);//指明Delphi采用Document编码
end.
Delphi端还是按照以前的代码书写即可:
uses
Service;
......
var
a:ServiceSoap;
begin
a := GetServiceSoap;
Caption := a.HelloWorld;
end;
如果需要在WebService中传送汉字的参数,则建议在Service.pas中再添加一行代码
function GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;
const
defWSDL = 'http://localhost/myservice/service.asmx?wsdl';
defURL = 'http://localhost/myservice/service.asmx';
defSvc = 'Service';
defPrt = 'ServiceSoap';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
RIO.HTTPWebNode.UseUTF8InHeader := 'UTF-8'; //添加该行,指定采用UTF-8代码传输
try
Result := (RIO as ServiceSoap);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;
需要说明的是使用Delphi2006则不需要上述的改变即可以正确调用VS.NET 2005书写的WebService.
initialization
InvRegistry.RegisterInterface(TypeInfo(ServiceSoap), 'http://tempuri.org/', 'utf-8');
InvRegistry.RegisterInvokableClass(ServiceSoapImpl);
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ServiceSoap), 'http://tempuri.org/HelloWorld');
InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);//指明Delphi采用Document编码
end.
Delphi端还是按照以前的代码书写即可:
uses
Service;
......
var
a:ServiceSoap;
begin
a := GetServiceSoap;
Caption := a.HelloWorld;
end;
如果需要在WebService中传送汉字的参数,则建议在Service.pas中再添加一行代码
function GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;
const
defWSDL = 'http://localhost/myservice/service.asmx?wsdl';
defURL = 'http://localhost/myservice/service.asmx';
defSvc = 'Service';
defPrt = 'ServiceSoap';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
RIO.HTTPWebNode.UseUTF8InHeader := 'UTF-8'; //添加该行,指定采用UTF-8代码传输
try
Result := (RIO as ServiceSoap);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;
需要说明的是使用Delphi2006则不需要上述的改变即可以正确调用VS.NET 2005书写的WebService.
相关文章推荐
- 用Delphi7访问.NET 2.0的WebService
- 用Delphi7 调用.NET 2.0的WebService 所要注意的问题(Document格式和UTF8编码)
- 转: 用Delphi7 调用.NET 2.0的WebService 所要注意的问题。
- 用Delphi7 调用.NET 2.0的WebService 所要注意的问题。
- 用Delphi7 调用.NET 2.0的WebService 所要注意的问题
- Delphi 调用 .net 2.0 的WebService的错误(BUG?)
- 用Delphi7 调用.NET 2.0的WebService 所要注意的问题
- flex 与 .net 交互【基于WebService的数据访问】
- Flex与.NET互操作(二):基于WebService的数据访问(上)
- 【.Net码农】异步调用WebService访问数据小结
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中超级经典的.NET2.0静态数据库访问组件,附源码
- .NET 访问JAVA的WebService使用SOAP头
- Flex与.NET互操作(二):基于WebService的数据访问(上)
- JBUILDER9 访问.NET构建的WEBSERVICE(2)
- 体验.net 2.0 的优雅(1) -- 异步WebService调用
- 体验.net 2.0 的优雅 -- 异步WebService调用
- .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常
- Delphi 7.0编写程序访问JAX-WS提供的WebService问题
- .Net 2.0 WebService传递参数的问题
- .net webservice 发布后如何设置所有人都可以访问