2013-02-11 14 views
6

Dịch vụ của tôi hoạt động đối với các phương pháp khác nhưng khi tôi cố gắng gọi phương thức có bộ sưu tập phức tạp hơn, tôi nhận được lỗi (từ Service Trace Viewer)Lỗi WCF 'Đã xảy ra lỗi khi cố gắng sắp xếp tham số ...'

'Đã xảy ra lỗi khi cố gắng tuần tự hóa tham số http://tempuri.org/:GetDataEventSetResult. Thông báo InnerException là 'Loại' MimosaServerLib.DAInt 'với tên hợp đồng dữ liệu' DAInt: http://schemas.datacontract.org/2004/07/MimosaServerLib 'không được mong đợi ...'

Trả lời cho các câu hỏi có lỗi giống như tôi đã thấy liên quan đến việc thay đổi định nghĩa lớp học tắt 'ProxyCreationEnabled' nhưng các lớp tôi đang làm việc với (DataEventSet, DAInt) đến từ một tệp được tạo tự động bằng công cụ xsd mà tôi đã cung cấp. tức là tôi không nên thay đổi nó.

tôi tạo ra các đối tượng DataEventSet, được tiếp xúc, như vậy:

private DataEventSet CreateDataEventSet() 
    { 
     DataEventSet aDataEventSet = new DataEventSet(); 
     DataEvent[] dataEvents = new DataEvent[2]; 
     DAInt aDAInt = new DAInt(); 
      aDAInt.id = 100100100; 
      aDAInt.value = 1; 
      dataEvents[0] = aDAInt; 
     DADataSeq aDADataSeq = new DADataSeq(); 
      aDADataSeq.id = 200100100; 
      double[] vals = new double[2]; 
       vals[0] = 5; 
       vals[1] = 44; 
      aDADataSeq.values = vals; 
      double[] vals2 = new double[2]; 
       vals2[0] = 1; 
       vals2[1] = 1; 
      aDADataSeq.xAxisDeltas = vals2; 
      aDADataSeq.xAxisStart = 0; 
      dataEvents[1] = aDADataSeq; 
     aDataEventSet.id = 0; 
     Site aSite = new Site(); 
      aSite.category = SITE_CATEGORY.SITE_SPECIFIC; 
     aDataEventSet.site = aSite; 
     OsacbmTime aTime = new OsacbmTime(); 
      aTime.tick_time = 12313246; 
      aTime.time = "2007-09-20T14:46:04.123"; 
      aTime.time_type = OsacbmTimeType.OSACBM_TIME_MIMOSA; 
     aDataEventSet.time = aTime; 
     aDataEventSet.dataEvents = dataEvents; 

     return aDataEventSet; 
    } 

Edit: Định nghĩa lớp của DataEventSet

//This source code was auto-generated by xsd 

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mimosa.org/OSACBMV3-1l")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.mimosa.org/OSACBMV3-1l", IsNullable=false)] 
public partial class DataEventSet { 

private bool alertStatusField; 

private bool alertStatusFieldSpecified; 

private DataEvent[] dataEventsField; 

private ulong idField; 

private Site siteField; 

private OsacbmTime timeField; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public bool alertStatus { 
    get { 
     return this.alertStatusField; 
    } 
    set { 
     this.alertStatusField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool alertStatusSpecified { 
    get { 
     return this.alertStatusFieldSpecified; 
    } 
    set { 
     this.alertStatusFieldSpecified = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("dataEvents", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public DataEvent[] dataEvents { 
    get { 
     return this.dataEventsField; 
    } 
    set { 
     this.dataEventsField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public ulong id { 
    get { 
     return this.idField; 
    } 
    set { 
     this.idField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public Site site { 
    get { 
     return this.siteField; 
    } 
    set { 
     this.siteField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public OsacbmTime time { 
    get { 
     return this.timeField; 
    } 
    set { 
     this.timeField = value; 
    } 
} 

}

Trả lời

6

Tôi nghĩ rằng bạn sẽ cần để thêm thuộc tính KnownType(typeof(DAInt)) vào lớp DataEventSet vì bạn đang sử dụng nó theo cách đa hình. Tôi thường thêm các thay đổi của mình vào mã được tạo trong một tệp mới có tên là DataEventSet.xsd.nongenerated.cs. Đây là lý do tại sao mã được tạo ra tạo ra các lớp như là các lớp một phần.

Bên DataEventSet.xsd.nongenerated.cs, bạn sẽ có một cái gì đó như thế này:

[KnownType(typeof(DAInt))] 
public partial class DataEventSet { 
} 

Nếu điều đó không làm việc, sau đó bạn có thể luôn luôn cố gắng thay đổi hợp đồng sử dụng XmlSerializer thay vì DataContractSerializer. Điều đó sẽ hoạt động tốt vì nó sử dụng các thuộc tính Xml được tạo bởi xsd.exe.

Bạn có thể chỉ định thời gian chạy sử dụng XmlSerializer bằng cách thêm thuộc tính XmlSerializerFormatter vào hợp đồng dịch vụ.

+0

Cảm ơn! Nó hoạt động trong WCF Test Client ngay bây giờ. Nhưng khi tôi cố gắng truy cập dịch vụ với một Máy khách bên ngoài, tôi nhận được một 'NetDispatcherFaultException': "http://tempuri.org/:GetDataEventSetResult. Thông báo InnerException là 'Lỗi ở vị trí dòng 1 898. Phần tử' http: // schemas .datacontract.org/2004/07/MimosaServerLib: DataEvent 'chứa dữ liệu từ một loại ánh xạ tới tên. " – Jimmy

+0

Giải quyết: Cần cập nhật tham chiếu dịch vụ lol. – Jimmy

+0

Đó có phải là sử dụng thuộc tính KnownType() không? –