Delphi SOAP客户端报错:服务器无法处理请求——字符串引用未实例化
排查WebService调用时的"String reference not set to an instance of a String"错误
我来帮你一步步揪出这个问题的根源,结合你的客户端代码和服务端方法签名,几个明显的关键点可能导致了这个空引用错误:
1. 输出参数未初始化是核心问题
你的客户端代码里用了res[0]作为服务端UploadChunkResult的输出参数,但res是ArrayOfString类型,你完全没初始化这个数组的元素——直接用res[0]的话,它就是个空引用,服务端尝试给这个空对象赋值时自然会抛出"String reference not set to an instance of a String"错误。
解决办法很简单:要么提前初始化数组元素,要么直接用单个字符串变量代替数组(毕竟服务端返回的是单个WideString,没必要用数组):
procedure TForm1.Button2Click(Sender: TObject); var wf: ImportSoap; risposta: WideString; // 用单个字符串接收输出结果 error: WideString; begin wf := (httprio1 as ImportSoap); error := ''; // 提前初始化错误输出参数 // 调用方法时直接传初始化后的变量 wf.UploadChunk('*user*','*password*',convertStringToTByteDynArray(Codifica64(Edit1.Text)),risposta,error); memo1.Lines.Text := risposta; // 顺便可以打印错误信息,方便排查 if error <> '' then ShowMessage('服务端错误:' + error); end;
2. 变量名拼写错误
看你的客户端代码最后一行:memo1.Lines.Text:=risposta;,但你前面声明的是res:ArrayOfString;——risposta这个变量根本没定义!这要么是你写代码时的笔误,要么是复制粘贴时的错误,这个问题也会导致运行时异常,得先修正过来。
3. 额外检查点
- 确认
Edit1.Text不是空值,如果是空的,Codifica64转换后的Base64字符串也会是空,可能引发服务端的其他逻辑错误; - 验证
Codifica64和convertStringToTByteDynArray这两个自定义函数的实现是否正确,确保转换后的字节数组符合服务端的预期。
先把前两个核心问题修正,再测试调用,应该就能解决这个空引用错误了。
内容的提问来源于stack exchange,提问作者Raffaele
相关产品推荐
相关产品推荐

