Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WCF client returns empty array - XML response seems OK

I'm trying to create a simple WCF Client (C#) for a web service hosted on our intranet. Using Fiddler and SoapUI I can see the request and response seems OK, but when I run the code an empty array is returned.

I'll try to paste only the relevant lines (and yet will be a LOT of stuff), but feel free to ask if I missed something:

WSDL:

<s0:definitions name="Workforce_2_1_0" targetNamespace="ld:Logical/Workforce_2_1_0_ws" xmlns:s0="http://schemas.xmlsoap.org/wsdl/" xmlns:s1="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:s2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:s3="ld:Logical/Workforce_2_1_0_ws" xmlns:s4="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
   <s0:documentation>Oracle Data Service Integrator Web Service</s0:documentation>
   <s1:Policy s2:Id="Mtom.xml">
      <wsoma:OptimizedMimeSerialization xmlns:wsoma="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization"/>
   </s1:Policy>
   <wsp:UsingPolicy s0:Required="true"/>
   <s0:types>
      <xs:schema elementFormDefault="qualified" targetNamespace="ld:Logical/Workforce_2_1_0_ws" xmlns:dsns0="http://schemata.enterprise.biz/hr/2.1" xmlns:s1="ld:Logical/Workforce_2_1_0_ws" xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:stns="ld:Logical/Workforce_2_1_0_ws" xmlns:tns="ld:Logical/Workforce_2_1_0_ws" xmlns:xs="http://www.w3.org/2001/XMLSchema">
         <xs:import namespace="http://schemata.enterprise.biz/hr/2.1" schemaLocation="http://server123.enterprise.com:31900/MyService/Services/Workforce_2-1-0?SCHEMA%2FMyService%2FResources%2FSchemas%2FWorkForce_2.1"/>
         <xs:element name="getByKey">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="key" type="xs:string"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:schema>
   </s0:types>
   <s0:message name="getByKeyIn">
      <s0:part element="s3:getByKey" name="parameters"/>
   </s0:message>
   <s0:message name="getByKeyOut">
      <s0:part element="s3:getByKeyResponse" name="parameters"/>
   </s0:message>
   <s0:portType name="Workforce_2_1_0PT">
      <s0:operation name="getByKey">
         <s0:input message="s3:getByKeyIn"/>
         <s0:output message="s3:getByKeyOut"/>
      </s0:operation>
   </s0:portType>
   <s0:binding name="Workforce_2_1_0SoapBinding" type="s3:Workforce_2_1_0PT">
      <s4:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsp:Policy>
         <wsp:PolicyReference URI="#Mtom.xml"/>
      </wsp:Policy>
      <s0:operation name="getByKey">
         <s4:operation soapAction="ld:Logical/Workforce_2_1_0_ws/getByKey" style="document"/>
         <s0:input>
            <s4:body use="literal"/>
         </s0:input>
         <s0:output>
            <s4:body use="literal"/>
         </s0:output>
      </s0:operation>
   </s0:binding>
   <s0:service name="Workforce_2_1_0SoapService">
      <s0:port binding="s3:Workforce_2_1_0SoapBinding" name="Workforce_2_1_0SoapPort">
         <s4:address location="http://server123.enterprise.com:31900/MyService/Services/Workforce_2-1-0"/>
      </s0:port>
   </s0:service>
</s0:definitions>

Binding configuration:

<basicHttpBinding>
  <binding name="Workforce_2_1_0SoapBinding" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Basic" proxyCredentialType="None"
          realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
  </binding>
</basicHttpBinding>

Endpoint:

<endpoint address="http://server123.enterprise.com:31900/MyService/Services/Workforce_2-1-0"
    binding="basicHttpBinding" bindingConfiguration="Workforce_2_1_0SoapBinding"
    contract="Workforce.Workforce_2_1_0PT" name="Workforce_2_1_0SoapPort" />

Request (through Fiddler):

<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">
        <getByKey xmlns="ld:Logical/Workforce_2_1_0_ws">
            <key>ABCDEFGH</key>
        </getByKey>
    </s:Body>
</s:Envelope>

Response (through Fiddler):

<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>
    <soapenv:Header></soapenv:Header>
    <soapenv:Body>
        <ns:getByKeyResponse xmlns:ns='ld:Logical/Workforce_2_1_0_ws'>
            <ns0:basicWorkforce xmlns:ns0="http://schemata.enterprise.biz/hr/2.1">
                <ns0:key>ABCDEFGH</ns0:key>
                <ns0:name>JUAN PABLO MONTOYA</ns0:name>
            </ns0:basicWorkforce>
        </ns:getByKeyResponse>
    </soapenv:Body>
</soapenv:Envelope>

Client code:

Workforce_2_1_0PTClient client = new Workforce_2_1_0PTClient();

client.ClientCredentials.UserName.UserName = "MyUsername";
client.ClientCredentials.UserName.Password = "MyPassword";

var result = client.getByKey("ABCDEFGH");

EDIT: Including proxy code, generated by Visual Studio

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="getByKey", WrapperNamespace="ld:Logical/Workforce_2_1_0_ws", IsWrapped=true)]
public partial class getByKeyRequest {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="ld:Logical/Workforce_2_1_0_ws", Order=0)]
    public string key;

    public getByKeyRequest() {
    }

    public getByKeyRequest(string key) {
        this.key = key;
    }
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="getByKeyResponse", WrapperNamespace="ld:Logical/Workforce_2_1_0_ws", IsWrapped=true)]
public partial class getByKeyResponse {
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemata.enterprise.biz/hr/2.1", Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("basicWorkforce")]
    public basicWorkforce[] basicWorkforce;

    public getByKeyResponse() {
    }

    public getByKeyResponse(basicWorkforce[] basicWorkforce) {
        this.basicWorkforce = basicWorkforce;
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://schemata.enterprise.biz/hr/2.1")]
public partial class basicWorkforce : object, System.ComponentModel.INotifyPropertyChanged {

    private string keyField;

    private string nameField;

    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public string key {
        get {
            return this.keyField;
        }
        set {
            this.keyField = value;
            this.RaisePropertyChanged("key");
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Order=1)]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
            this.RaisePropertyChanged("name");
        }
    }
}

Even if the response contains one basicWorkforce element, the result variable is an empty array of basicWorkforce.

Sorry about the long post and thanks in advance for the help.

like image 801
Anderson Pimentel Avatar asked Apr 17 '12 17:04

Anderson Pimentel


1 Answers

Finally did it! For anyone facing the same problem, it lies on the namespaces. In this case, on the array returned by getByKeyResponse.

So, I just replaced this:

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemata.enterprise.biz/hr/2.1", Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("basicWorkforce")]
    public basicWorkforce[] basicWorkforce;

with this:

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemata.enterprise.biz/hr/2.1", Order=0)]
    [System.Xml.Serialization.XmlElementAttribute("basicWorkforce", Namespace = "http://schemata.enterprise.biz/hr/2.1")]
    public basicWorkforce[] basicWorkforce;
like image 153
Anderson Pimentel Avatar answered Oct 23 '22 03:10

Anderson Pimentel