2012-04-17 26 views
5

Tôi đang cố tạo một WCF Client đơn giản (C#) cho một dịch vụ web được lưu trữ trên mạng nội bộ của chúng tôi. Sử dụng Fiddler và SoapUI Tôi có thể thấy yêu cầu và phản hồi có vẻ OK, nhưng khi tôi chạy mã một mảng trống được trả về.WCF khách hàng trả về mảng trống - phản hồi XML có vẻ OK

Tôi sẽ cố gắng để dán chỉ các dòng có liên quan (nhưng sẽ có rất nhiều thứ), nhưng đừng ngần ngại hỏi nếu tôi bỏ lỡ một cái gì đó:

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> 

cấu hình Binding:

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

Yêu cầu (thông qua 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> 

đáp ứng (thông qua 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> 

Khách hàng đang:

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: Bao gồm mã proxy, được tạo ra bởi 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"); 
     } 
    } 
} 

Thậm chí nếu phản ứng có chứa một basicWorkforce yếu tố, biến result là một mảng trống của basicWorkforce.

Xin lỗi về bài đăng dài và cảm ơn trước sự giúp đỡ.

Trả lời

4

Cuối cùng đã làm được! Đối với bất kỳ ai phải đối mặt với cùng một vấn đề, nó nằm trên các không gian tên. Trong trường hợp này, trên mảng được trả về bởi getByKeyResponse.

Vì vậy, tôi chỉ thay thế này:

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

với điều này:

[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; 
+1

Tôi đang đối mặt với cùng một vấn đề, tôi đã thử giải pháp này nhưng nó không được sửa chữa. Bạn có thể giúp tôi được không? http://stackoverflow.com/questions/34450237/wsdl-web-service-returns-empty-array-from-c-sharp –

+0

Đăng câu trả lời ở đó. Đó là một điều khó khăn! –

0

Có bạn đã thực hiện Collection Loại để System.Array
của nó trong tài liệu tham khảo thêm dịch vụ -> Advanced
HOẶC
dưới Tài liệu tham khảo Dịch vụ -> Configure Dịch vụ Tài liệu tham khảo.

+0

Vâng, đó là thiết lập để System.Array, nhưng tôi cũng đã cố gắng System.Generic.List không có may mắn. –

Các vấn đề liên quan