【问题标题】:Unmarshalling Error解组错误
【发布时间】:2011-02-03 09:51:52
【问题描述】:

每当我尝试向 SOAP 服务发出请求时,都会引发一个非常异常(恕我直言)的错误:

解组错误:意外元素(uri:“http://www.domain.com/ws/servicename/”,本地:“dummyArg”)。预期元素是

我调用的方法定义为:

function GetData(const dummyArg: WideString): Array_Of_Data; stdcall;

我对 SOAP 几乎没有经验,因此我 [ ] 快要失去理智了,我找不到任何有用的信息。 随意提出任何可能加快问题发现过程的问题。

编辑:我使用的是 Delphi 2010,我已经像这样调用了该方法: GetData(EmptyStr);GetData('null');GetData('{}');

感谢您的宝贵时间。

【问题讨论】:

    标签: delphi soap c++builder


    【解决方案1】:

    我已经设法找到解决问题的方法,只需将单元初始化部分中的调用选项从 ioDocument 替换为 ioHasNamespace 或 ioHasAllSOAPActions 即可正确生成 SOAP 请求,例如:

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

    改成

    InvRegistry.RegisterInvokeOptions(TypeInfo(YourSoapInterface), ioHasNamespace);
    

    InvRegistry.RegisterInvokeOptions(TypeInfo(YourSoapInterface), ioHasAllSOAPActions);
    

    这是我能找到的最干净的解决方法。

    【讨论】:

      【解决方案2】:

      我假设引发的异常类型为 ERemotableException (http://docwiki.embarcadero.com/VCL/en/InvokeRegistry.ERemotableException) 对吗?这意味着服务不喜欢该请求并返回一个故障; SOAP 运行时在看到错误后,会在收到的消息中引发本地异常。

      根据服务所说,

      解组错误:意外 元素 (uri:"http://www.domain.com/ws/servicename/", 本地:“dummyArg”)。预期元素 是

      ...我假设客户端生成了无效的 XML 请求。服务可能需要支持 2010 年不支持的某些 XML/SOAP 构造。例如,D2010 导入器/运行时假定每个操作的名称空间请求/响应与接口/端口类型匹配。这通常是这种情况,但并非总是如此。在 Delphi XE 中,通过在必要时添加对注册请求/响应的命名空间的支持来解决此问题。并且可以在较早的运行时对这些修复进行改造:首先要评估问题。

      您能否发布指向该服务的 WSDL 的链接?通过访问 WSDL 来调查这些问题要容易得多。谢谢。

      干杯,

      布鲁诺

      【讨论】:

      • 感谢您的评论,是的,问题是 Delphi 提出的请求不是服务所期望的,很抱歉,为了使用它,WSDL 没有进一步公开您将需要一个用户名和一个密码,这使得允许某人访问它变得更加困难。关于如何在 Delphi 2010 中绕过此问题的任何想法?谢谢布鲁诺!
      • 我看到你解决了这个问题。如果您遇到类似的问题,我实际上不需要访问该服务,如果可能,您可以直接通过电子邮件将 WSDL 发送给我:WSDL 和 Schema 提供了足够的信息来评估 Delphi/CBuilder 请求是否正确.如果 WSDL 导入器生成了不正确的注册选项,如果可能的话,我还想对此进行调查。 WSDL 的修改版本(所有命名空间/端口类型/操作/部件/等重命名)也可以做到这一点。谢谢。
      • 谢谢布鲁诺,你太客气了,但我的客户对此非常严格,我想在问题中写下所有信息,但是我不能......希望其他人能去遇到类似问题可以通过查看此问题更快地解决。
      【解决方案3】:

      我遇到了同样的问题。我的决定与那些不同。 要解决这个问题,您应该在 Delphi 的 WSDL Importer Dialog 中正确设置选项。就我而言,我选择了 2 个附加选项:

      • "将纯集合映射到包装类类型 (-Ok)
      • 将字符串映射到 WideString (-Ow)

      重建应用程序,错误消失了。希望这会对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多