Не отображаются данные из службы SOAP - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть интересная проблема, связанная с консольным клиентом C # и веб-сервисом.Я подозреваю, что где-то есть ошибка пространства имен или что-то простое, но восемь часов тупого взгляда на экран еще не выявили их, поэтому я решил попробовать еще несколько глаз.

WSDL

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://
schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:schema="http://xxx.com/BillOfMaterials/schemas" xmlns:tns="http://
xxx.com/BillOfMaterials/definitions"
targetNamespace="http://xxx.com/BillOfMaterials/definitions">
    <wsdl:types>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:import namespace="http://xxx.com/BillOfMaterials/
schemas" schemaLocation="BOMRequest.xsd" id="input"/>

    <xs:import namespace="http://xxx.com/BillOfMaterials/schemas" 
schemaLocation="BOMResponse.xsd" id="output"/>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="BomRequest">
        <wsdl:part name="input" element="schema:BOMin"/>
    </wsdl:message>
    <wsdl:message name="BomResponse">
        <wsdl:part name="output" element="schema:BOMResponse"/>
    </wsdl:message>
    <wsdl:portType name="BOMPortType">
        <wsdl:operation name="BOM">
            <wsdl:input message="tns:BomRequest"/>
            <wsdl:output message="tns:BomResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="BOMBinding" type="tns:BOMPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/
http"/>
        <wsdl:operation name="BOM">
            <soap:operation soapAction="urn:#BOMOperation"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="BOMService">
        <wsdl:port name="BOMPort" binding="tns:BOMBinding">
            <soap:address location="http://xxx/BOM"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Запрос XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/
XMLSchema" xmlns:in="http://secotools.com/BillOfMaterials/schemas" 
targetNamespace="http://xxx.com/BillOfMaterials/schemas" elementFormDefault="qualified">
    <xs:element name="BOMin" type="in:BOMRequestItem"/>
    <xs:complexType name="BOMRequestItem">
        <xs:sequence>
            <xs:element name="ProductNumber" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Ответ XSD (сокращен, поскольку он большой)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/
XMLSchema" xmlns:in="http://xxx.com/BillOfMaterials/schemas" 
targetNamespace="http://xxx.com/BillOfMaterials/schemas" 
elementFormDefault="qualified">
    <xs:element name="BOMResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="BOMResponses" type="in:BOMResponseItem" 
minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="BOMResponseItem">
        <xs:sequence>
            <xs:element name="Company" type="xs:string"/>
            <xs:element name="Facility" type="xs:string"/>
            <xs:element name="ProductNumber" type="xs:string"/>
            <xs:element name="ProductStructureType" type="xs:string"/>
            <xs:element name="Name" type="xs:string"/>

Используя этот WSDL, я получаю следующий запрос и ответ в soapUI: SoapUIзапрос:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:sch="http://xxx.com/BillOfMaterials/schemas">
   <soapenv:Header/>
   <soapenv:Body>
      <sch:BOMin>
         <ProductNumber>12345</ProductNumber>
      </sch:BOMin>
   </soapenv:Body>
</soapenv:Envelope>

Ответ SoapUI (сокращен для удобства чтения):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:out="http://xxx.com/BillOfMaterials/schemas">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <out:BOMResponse>
         <Company>1</Company>
         <Facility>1</Facility>
         <ProductNumber>12345</ProductNumber>
         <ProductStructureType>PLU</ProductStructureType>
         <Name>My dummy product</Name>

Я пробовал оба сгенерировать прокси с помощью svcutil и использовал сервисную ссылку в C # безрезультатно.SoapUI работает должным образом и возвращает данные, в то время как C # получает пустой список.

Тестовый код C #

class Program
{
    static void Main(string[] args)
    {
        BOMPortTypeClient _client = new BOMPortTypeClient();
        var state = _client.State;
        BOMRequestItem _reqItem = new BOMRequestItem
        {
            ProductNumber = "12345"
        };

        IList<BOMResponseItem> _list = _client.BOM(_reqItem);
    }
}

Редактирование: добавлены журналы Fiddler с запросом / ответом от .Net

.Net request

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <BOMin xmlns="http://xxx.com/BillOfMaterials/schemas">
       <ProductNumber>12345</ProductNumber>
    </BOMin>
  </s:Body>
</s:Envelope>

.Net response

<?xml version="1.0" ?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://xxx.com/BillOfMaterials/schemas" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <s:Header/>
   <s:Body>
      <BOMResponse>
         <Company>1</Company>
         <Facility>1</Facility>
         <ProductNumber>12345</ProductNumber>
         <ProductStructureType>PLU</ProductStructureType>
         <Name>My dummy product</Name>

Поскольку я получаю данные обратно, я знаю, что служба понимает запрос от .Net, проблема в том, что .Net, кажется, не в состоянии понятьответ.Вот почему я сначала подумал, что это проблема пространства имен.Теперь я не так уверен.Я не получаю ошибок в .Net, просто пустой массив.

...