c# Webservice客户端:如何避免导致服务抛出SystemException(似乎是一个xml命名空间问题)

本文关键字:似乎是 一个 问题 命名空间 xml SystemException 客户端 Webservice 何避免 服务 | 更新日期: 2023-09-27 18:10:17

我试图从c#中使用一个专有的、基于JBoss的应用程序(通过服务引用)中使用基于SOAP的web服务,但是服务器一直返回SystemException。

我使用fiddler捕获来自供应商的flash前端和c#的webservice调用,并在soapUI中比较/调整它们,直到我将差异追踪到名称间距问题。

基本上采取非工作消息并使其工作,我将<addPackageItems xmlns="...">修改为<tns:addPackageItems xmlns:tns="...">, </addPackageItems>修改为</tns:addPackageItems>

我的问题基本上是我如何通过在客户端(我的c#代码)进行修改来完成这项工作?我讨厌如此通用,但说实话,我不知道为什么需要命名空间来避免服务器上的错误,所以我不想问如何修改我的c#代码来生成addPackageItems上的xmlns的名称空间,如果有一个替代的,更好的解决方案。

混杂。

c#代码使用了在Visual Studio 2012下添加服务引用生成的代码。我可以提供电话号码;如果没有可用的WSDL,我不相信它真的有用,而且我不确定我是否被允许在我们的协议下提供它们(我从未见过它)。

不工作的SOAP消息

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<s:Body>
  <addPackageItems xmlns="http://www.docfinity.com/webservices/BpmClientWebServices/">
    <processInstanceId>87499</processInstanceId>
    <packageItemDto>
      <packageItemName>document</packageItemName>
        <properties>
         <name>documentId</name>
         <stringValue>0c7eb1cb3a94986f013ae5c4d8777fde</stringValue>
        </properties>
        <type>DocFinityDocument</type>
      </packageItemDto>
    </addPackageItems>
  </s:Body>
</s:Envelope>

工作soap消息

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<s:Body>
  <tns:addPackageItems xmlns:tns="http://www.docfinity.com/webservices/BpmClientWebServices/">
    <processInstanceId>87499</processInstanceId>
    <packageItemDto>
      <packageItemName>document</packageItemName>
        <properties>
         <name>documentId</name>
         <stringValue>0c7eb1cb3a94986f013ae5c4d8777fde</stringValue>
        </properties>
        <type>DocFinityDocument</type>
      </packageItemDto>
    </tns:addPackageItems>
  </s:Body>
</s:Envelope>

c# Webservice客户端:如何避免导致服务抛出SystemException(似乎是一个xml命名空间问题)

两个XML文档几乎是完全不同的——结果一个工作另一个没有。

  • <addPackageItems xmlns="http://www...表示"这个和所有没有前缀的子节点都有这个命名空间"
  • <tns:addPackageItems xmlns:tns="http://www...表示"此和节点所有带有tns前缀的子节点都具有此命名空间,没有前缀的节点具有先前的默认命名空间。

所以在2个文档<processInstanceId>节点(和兄弟/子节点)有不同的命名空间- "http://www.docfinity.com/webs…"在第一个,在第二个空。

您需要小心地在正确的名称空间中创建节点。指定名称空间的方式取决于您创建XML的方式。

相关文章: