You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:33:05