2017-11-23 6 views
0

내 프로젝트 중 하나에 ServiceReference를 추가했습니다.이 서비스가 .net으로 만들어 졌는지 확실하지 않습니다. 하나의 작업에 대한 호출을 수행 할 때 1 요소 및이 요소는 null 값으로 가득 차있다, 나는 바이올린과 데이터와 응답을 확인했습니다 올바르게 들어오고있다. 왜 이런 일이 일어나는 지 아십니까?자동 생성 된 SOAP 클라이언트가 응답을 구문 분석하지 않음

SoapResponse 구조 :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <searchOrderResponse xmlns="http://xml.comcast.com/nationalaccountsportal/services"> 
     <searchOrderReturn> 
      <ns1:searchResult xsi:type="ns1:OrderDetails" xmlns:ns1="http://xml.comcast.com/nationalaccountsportal/types"> <!-- The data --> 
      <ns2:searchResult xsi:type="ns2:OrderDetails" xmlns:ns2="http://xml.comcast.com/nationalaccountsportal/types"> 

자동 생성 클래스 정의 :

[System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
    [System.ServiceModel.MessageContractAttribute(WrapperName="searchOrderResponse", WrapperNamespace="http://xml.comcast.com/nationalaccountsportal/services", IsWrapped=true)] 
    internal partial class searchOrderResponse { 

     [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://xml.comcast.com/nationalaccountsportal/services", Order=0)] 
     [System.Xml.Serialization.XmlElementAttribute("searchOrderReturn")] 
     public OrderDetails[] searchOrderReturn; 

     public searchOrderResponse() { 
     } 

     public searchOrderResponse(OrderDetails[] searchOrderReturn) { 
      this.searchOrderReturn = searchOrderReturn; 
     } 
    } 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1590.0")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://xml.comcast.com/nationalaccountsportal/types")] 
    public partial class OrderDetails : object, System.ComponentModel.INotifyPropertyChanged { 

searchOrderResponse 정의 WSDL에서 :

<element name="searchOrderResponse"> 
     <complexType> 
      <sequence> 
      <element maxOccurs="unbounded" name="searchOrderReturn" type="tns1:OrderDetails"/> 
      </sequence> 
     </complexType> 
     </element> 

감사합니다!

+0

빈의 이상한 구현 것 같은데 도움이되기를 바랍니다 :이 후에는 다음과 같이 응답 클래스의 반환 형식을 변경해야 목록, 즉 버그가있는 서비스입니다. 전체 모음에 대한 NULL 값이 작동합니다. WSDL을 보지 않고도 말하기가 어렵다. – Namphibian

+0

안녕하세요 @ Namphibian, wsdl의 searchOrderResponse 정의를 추가했습니다. 다른 모든 정의는 OrderDetails 배열을 직접 노출하는 것을 제외하고 나에게 표준으로 표시됩니다. 다른 응답에서 ResponseType 클래스를 만들 수도 있습니다. 다른 배열 형식의 응답이 없으므로이 서비스 내의 다른 작업과 비교합니다. –

답변

0

여러분을 업데이트하는 것을 잊었습니다. WSDL이 VS에서 잘못된 코드를 생성하는 것을 잘못 설명하고, 태그 중 하나가 누락되었거나 VS에서 'ResponseType'을 생성하므로 문제가 발생합니다. 추가 : 그것은 VS 이름에게 그것을했습니다 얼마나 이후

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1590.0")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://xml.comcast.com/nationalaccountsportal/types")] 
public partial class SearchOrderResponseType : object, System.ComponentModel.INotifyPropertyChanged 
{ 

    private OrderDetails[] searchResultField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Order = 0)] 
    public OrderDetails[] searchResult 
    { 
     get 
     { 
      return this.searchResultField; 
     } 
     set 
     { 
      this.searchResultField = value; 
      this.RaisePropertyChanged("searchResult"); 
     } 
    } 

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
     if ((propertyChanged != null)) 
     { 
      propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

주의 속성이 위의 응답 구조로, 클래스의 이름이 다를 수 있습니다, 같은 SearchResult라고,하지만 난 SearchOrderResponseType로 유지됩니다.

[System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
    [System.ServiceModel.MessageContractAttribute(WrapperName="searchOrderResponse", WrapperNamespace="http://xml.comcast.com/nationalaccountsportal/services", IsWrapped=true)] 
    internal partial class searchOrderResponse { 

     [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://xml.comcast.com/nationalaccountsportal/services", Order=0)] 
     [System.Xml.Serialization.XmlElementAttribute("searchOrderReturn")] 
     public SearchOrderResponseType searchOrderReturn; 

     public searchOrderResponse() { 
     } 

     public searchOrderResponse(SearchOrderResponseType searchOrderReturn) { 
      this.searchOrderReturn = searchOrderReturn; 
     } 
    } 

그래서, 기본적으로, 누락 된 단지 하나 개의 클래스이며,이