当我用我的客户端调用SOAP方法时,我有一个非常有趣的问题,我必须传递一个类型为Array_Of_Int(Array_Of_Int = Integer数组)的参数,问题是当数组正在在请求生成,它会生成以下在SOAP客户端的Array_Of_Int
<ArrayParam>
<item>12345</item>
<item>23456</item>
<item>34567</item>
</ArrayParam>
,但我相信,服务器预期
<ArrayParam>12345</ArrayParam>
<ArrayParam>23456</ArrayParam>
<ArrayParam>34567</ArrayParam>
我敢肯定,德尔福有莫名其妙的RegisterSerializeOptions或RegisterInvokeOptions针对此问题的解决办法,但是我似乎无法找到问题,想法?
谢谢大家的时间,我用Delphi 2010
编辑:为了解决这个问题,因为布诺提到的,我们必须产生的初始化部分添加以下代码。 PAS文件:
InvRegistry.RegisterInvokeOptions(TypeInfo(<ServerInterfaceNameHere>), ioDocument);
然而强加的另一个问题,命名空间,作为一个快速,漂亮优雅的修复,我已经添加在THTTPRIO的OnBeforeExecute方法如下代码
procedure TMyDataModule.MyRioBeforeExecute(const MethodName: string; SOAPRequest: TStream);
procedure FixNamespaces;
var
LStrings: TStringList;
begin
LStrings := TStringList.Create;
try
SOAPRequest.Position := 0;
LStrings.LoadFromStream(SOAPRequest);
SOAPRequest.Position := 0;
SOAPRequest.Size := 0;
LStrings.Text := StringReplace(LStrings.Text, MethodName, 'NS1:' + MethodName, [rfReplaceAll]);
LStrings.Text := StringReplace(LStrings.Text, MethodName + ' xmlns', MethodName + ' xmlns:NS1', []);
LStrings.SaveToStream(SOAPRequest);
SOAPRequest.Position := 0;
finally
FreeAndNil(LStrings);
end; // tryf
end; // procedure FixNamespaces;
begin
FixNamespaces;
end;
以上是只是修复,我真希望我能找到一个更清洁,优雅的解决这个问题,如果有谁知道,请确实张贴你的答案。
我不能确认没有看到WSDL /架构,但基于你已发布的修复,该服务可能期望请求/响应的命名空间不同于接口的命名空间。只有通过'RequestNS'和'ResponseNS'属性才能将此支持添加到Delphi/XE中,进口商将在这些情况下为每种方法生成该属性。在Delphi XE之前,唯一的方法是通过BeforeExecute事件(如上所述)或通过在不同名称空间中注册接口。如果一个方法预期ns1而另一个预期ns2,则后者不起作用。 – BruneauB 2011-02-25 18:09:55
我真的很失望,因为我们没有灵活性(IMO)就如何提出SOAP请求,例如,如果某些属性,注册等将来可以解决,我不希望手动执行如此微不足道的操作下一个德尔福版本XE2,超级XE)我将需要至少审查每一个请求,以确保它的工作正常(这在某种程度上反对RAD的想法...),此外,我不会感到惊讶,如果支持将下降明年发布...反正客户对WSDL非常严格(不能公开[!])。非常感谢您支持Bruneau。 – ComputerSaysNo 2011-02-25 20:35:14
我同意你关于缺乏灵活性。将SOAP绑定到RTTI的最初计划是基于SOAP编码规则进行的。随着标准切换到XML编码,很明显这是一个不幸的决定,因为XML编码比RTTI编码需要更多的灵活性/定制: – BruneauB 2011-02-25 21:49:26