(转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题

(转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题

//add-------to support UTF-8
    RIO.HTTPWebNode.UseUTF8InHeader := true;  //添加该行,指定采用UTF-8代码传输
    RIO.Converter.Encoding:=‘UTF-8‘;
    RIO.Converter.Options:=RIO.Converter.Options +
[soUTF8InHeader,soUTF8EncodeXML];
   //add-------END

今天测试.net 2.0的WebService,发现了一个大问题。就是无法获取参数,参数永远是null。当然了使用.net调用

没有任何问题,web测试页也正常。不论是Delphi7还是java调用的结果的都是一样的,难道是.net 2.0的Bug?

测试结果发现:值类型参数全部为缺省值,引用类型全部为null

WebService的代码如下:

[WebMethod]

public string EchoString(string args)

{

return args;

}

[WebMethod]

public string EchoInt(int args)

{

return args.ToString();

}

delphi调用的代码

procedure TForm1.Button3Click(Sender: TObject);

var

ss:ServiceSoap;

hello:WideString;

begin

try

HTTPRIO1.WSDLLocation := edtAddress.Text;

HTTPRIO1.Service := edit3.Text;

HTTPRIO1.Port := edit4.Text;

ss := (HTTPRIO1 as ServiceSoap);

hello:= ‘hello‘;

Memo1.Lines.Add(ss.EchoInt(234));

except

on e : exception do

showmessage(e.Message);

end;

end;

---------------------------------------------------------------------------------------------------

-----------------------------------------------

在不断尝试中发现vs2003生成的web Services,delphi调用的时候不会有任何问题,即使是delphi2006也无法正常

调用.net 2.0的Web Service.

最后经过不懈努力,终于找到方法那就是在delphi生成webservices声明单元中加入以行

InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);

如:

unit Service;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

ServiceSoap = interface(IInvokable)

[‘{77573149-9C57-FA51-F11F-EFD527C91BD9}‘]

function HelloWorld(const asdf: WideString): WideString; stdcall;

end;

implementation

type

ServiceSoapImpl = class(TInvokableClass, ServiceSoap)

public

{ ServiceSoap }

function HelloWorld(const asdf: WideString): WideString; stdcall;

end;

function ServiceSoapImpl.HelloWorld(const asdf: WideString): WideString;

begin

{ TODO - Implement method HelloWorld }

end;

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);//就是这一行

end.

至此问题搞定了。

但是经过我的测试发现,还是不行.......找到了其他原因问题
解决了,

在用VS2005写的WebService的类属性中加入SoapRpcServiceAttribute属性就可以了。

如 下:
 [SoapRpcService(RoutingStyle=SoapServiceRoutingStyle.SoapAction)]

时间: 2024-08-03 07:11:19

(转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题的相关文章

Java cxf 调用.net编写的webservice接口

新到的公司第一份工作就是在java环境下调用前人编写的.net程序编写的webservice接口 接口返回的是JSON格式的数据 因为都说webservice跨语言,本来以为是个简单粗暴的工作,结果发现不是那么回事,.net生成的wsdl文件格式一些标签是java环境下不认识的,需要重新编辑下wsdl文件才行 首先,解压下载的CXF最新版的压缩包,DOS窗口下到bin目录,然后执行 wsdl2java -p ws http://192.168.1.137:8007/CIS_Server.asmx

ORA-01084: OCI 调用中的参数无效 的解决方法

oracle的数据类型如果为NCLOB,当在C#当中三层架构使用参数形式的话,如果插入空值或空字符串就会出现“ORA-01084: OCI 调用中的参数无效”的错误,之前在网上看到别人都说用“ ”(也就是空格)代替空值或者空字符串,但是我是一个纠结体,一直觉得这样不好,虽然之前有个项目也是这样做,但今天发现了一种更好的解决方法,就是用DBNULL.value.如下: /// <summary>        /// 增加一条数据        /// </summary>     

微信公众平台,微信网页授权,redirect_uri参数错误,解决方法!

刚才在做微信网页授权的时候,发生一个错误!!!微信网页授权redirect_uri 参数错误! 遇到问题,第一时间应该做的就是查看官网微信公众平台的技术文档. 微信网页授权 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域名的说明 1.在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修改授权回调域名

Jmeter: PATCH方法无法发送参数的暂时解决方法

最近在做API测试,前面的GET这些HTTP Request方法都无压力,顺利解决. 但碰到PATCH方法时,发现无法通过. 通过对比,发现PATCH方法的HTTP Request,无法把设置的Parameter添加到URL中. 如图, 添加Parameter后,URL是长这样子的,在POSTMAN/PAW是可以跑通过的. 在JMETER,HTTP Request中添加parameters是跑不通的,如图. 由下图可见,paramter并没有在发出请求的时候,添加到URL中. Google了好几

Delphi调用java开发的WebService,传入参数出错

http://www.cnblogs.com/zhangzhifeng/p/3397053.html 调用没有参数的服务正常,当调用有参数的服务出现以下错误java.util.concurrent.ExecutionException: java.lang.NullPointerException 另外加了RIO.HTTPWebNode.UseUTF8InHeader := True;InvRegistry.RegisterInvokeOptions(TypeInfo(ESBProService

C#中调用.NET编写的WebService(WSDL)

1. 开始菜单--Visual Studio xxx--Visual Studio Tools-- VS 开发人员命令提示 svcutil http://localhost:8080/xxxx/xxxx?wsdl 会生成相应的C#类文件和Config文件 2. 在C#工程中包含进C#类文件,并把Config文件内的内容复制到app.config里面 3. 在程序中例化C#类文件里面的服务类,即可开始调用服务类里面的函数.

shell中调用R语言并传入参数的两种方法

第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output cat myscript.Rout 调用R脚本的全部控制台log 传入参数: 在脚本中add args<-commandArgs(TRUE) 然后shell中: Rscript myscript.R arg1 arg2 arg3 注意取出来的参数是所有参数连在一起的character

Feign调用,get请求,参数为对象, 解决请求对象以及参数值为null

请求参数过多,所以包装成一个请求对象 服务端: @GetMapping(value = "/readInfos") public List<ExctractInfoVO> readHotels(Search search){ return this.service.readInfos(search); } API @FeignClient(name = "server")//服务名 public interface Server { @GetMappin

Delphi调用MSSQL存储过程返回的多个数据集的方法

varaintf:_Recordset;RecordsAffected:OleVariant; begin ADOStoredProc1.Close;ADOStoredProc1.Open;aintf:=ADOStoredProc1.Recordset;ADOQuery1.Recordset:=aintf;aintf:=aintf.NextRecordset(RecordsAffected);ADOQuery2.Recordset:=aintf; end; 此时,把存储过程中生成的二个数据集分别