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.
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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With