Клиент веб-службы С#: как избежать того, чтобы служба вызывала SystemException (похоже, проблема с пространством имен xml)

Я пытаюсь использовать веб-службу на основе SOAP из проприетарного приложения на основе JBoss из С# (через ссылку на службу), но сервер продолжает возвращать SystemException.

Я использовал fiddler для захвата вызовов веб-сервиса из внешнего интерфейса поставщика и из C# и сравнивал/настраивал их в soapUI, пока не отследил разницу до проблемы с интервалом между именами.

По сути, чтобы взять неработающее сообщение и заставить его работать, я изменяю <addPackageItems xmlns="..."> на <tns:addPackageItems xmlns:tns="..."> и </addPackageItems> на </tns:addPackageItems>.

Мой вопрос в основном заключается в том, как я могу сделать эту работу, внеся изменения в клиент (мой код С#)? Я ненавижу быть таким общим, но, честно говоря, я не знаю, почему пространство имен требуется, чтобы избежать ошибки на сервере, поэтому я не хотел спрашивать, как изменить мой код С#, чтобы создать пространство имен для xmlns на addPackageItems если есть альтернатива, лучшее решение.

Разное Информация

Код 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>

Рабочее мыльное сообщение

<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>

person W3t Tr3y    schedule 22.04.2013    source источник


Ответы (1)


2 XML-документы почти полностью разные - потому что другой не работает.

  • <addPackageItems xmlns="http://www... означает, что "этот и все дочерние узлы без префикса будут иметь это пространство имен"
  • <tns:addPackageItems xmlns:tns="http://www... означает, что «это и все дочерние узлы с префиксом tns имеют это пространство имен, узлы без префикса имеют предыдущее пространство имен по умолчанию.

Таким образом, в 2 документах <processInstanceId> узла (и одноуровневых/дочерних узлов) имеют разные пространства имен - "http://www.docfinity.com/webs..." в первом, пусто во втором.

Вы должны быть осторожны, чтобы создавать узлы в правильном пространстве имен. Способ указания пространств имен зависит от способа создания XML.

person Alexei Levenkov    schedule 22.04.2013
comment
Способ указания пространств имен зависит от способа создания XML. -- Правильно, и именно поэтому я специально указал, что использую C#, и добавил ссылку на службу в WSDL в Visual Studio 2012. Это автоматически создает все виды классов, поэтому я не уверен, как изменить и почему я было очень конкретно, что это модификация клиента, поскольку серверная часть не находится под моим контролем (технически сервер находится под контролем, но программное обеспечение является проприетарным, поэтому я не могу его изменить) - person W3t Tr3y; 22.04.2013