2012-08-27 48 views
0

這是我的問題。如果我像這樣撥打回撥號碼:取決於參數的WCF回調錯誤

clients[computerID].PrintLabelCallback(label); 

通道故障,我在客戶端發生CommunicationFault異常。呼叫是一種方式在服務器端不會造成任何問題。

如果我這樣稱呼它不過:

label.EntryLocation = null; 
label.EntryUser = null; 
label.ResultLine = null; 
label.Printer = null; 
label.Type = null; 
clients[computerID].PrintLabelCallback(label); 

凡EntryLocation,EntryUser等是我所定義的類。我不必清空基本類型,如String,int。那些穿過電線的事件沒有發生。似乎兩邊都使用了相同的類型,所以我不確定這是否失敗。

這是什麼原因造成的?我將如何解決它?

編輯:這裏是我的班級和相關領域的定義。

[DataContract(IsReference = true), JsonObject(IsReference = false), Serializable] 
public partial class Label : Interfaces.IRQSObject 
{ 

    /// <summary> 
    /// The location where the Label was created. 
    /// </summary> 
    [DataMember(EmitDefaultValue = false)] 
    public virtual Location EntryLocation { get; set; } 

    /// <summary> 
    /// The user that Generated the Label 
    /// </summary> 
    [DataMember(EmitDefaultValue = false)] 
    public virtual User EntryUser { get; set; } 

    /// <summary> 
    /// The printer that this label will be printed out at 
    /// </summary> 
    [DataMember(EmitDefaultValue = false)] 
    public virtual LabelPrinter Printer { get; set; } 

    /// <summary> 
    /// The Type of the label 
    /// </summary> 
    [DataMember(EmitDefaultValue = false)] 
    public virtual LabelType Type { get; set; } 

    [DataMember(EmitDefaultValue = false)] 
    public virtual ResultLine ResultLine { get; set; } 
} 
+1

你能發佈完整的異常消息嗎? –

+0

「通信對象System.ServiceModel.Channels.ServiceChannel不能用於通信,因爲它處於Faulted狀態。」 –

回答

0

事實證明,我的問題幾乎與我給的信息完全無關。我使用的是NHibernate,在此之前,我已經在傳回回調之前忘記了Detach這個對象。這是實際的錯誤(與svclog找到):

類型 'LocationProxy' 數據合同名稱 'LocationProxy:HTTP://schemas.datacontract.org/2004/07/' 預計不會。考慮使用DataContractResolver或將任何不知道的類型靜態添加到已知類型列表中 - 例如,使用KnownTypeAttribute屬性或將它們添加到傳遞給DataContractSerializer的已知類型列表中。

WCF抱怨當我將標籤附加到對象圖上時添加了神奇的NHibernate屬性。

+0

謝謝您分享實際解決方案,請不要忘記將其標記爲「已接受的答案」! –

0

我想,一個或多個類還沒有準備好系列化呢。

您可能需要標記與[DataContract]屬性的類,並且需要通過導線MITH的[DataMember] attribut

像下面這樣發送的所有成員:

[DataContract] 
public class PurchaseOrder 
{ 
    [DataMember] 
    public Address BillTo {get; set;} 
    [DataMember] 
    public Address ShipTo {get; set;}; 
} 

看一看這個MSDN文章:Serialization and Deserialization