您好,登錄后才能下訂單哦!
基礎連接已經關閉 連接被意外關閉
又被我碰到。
有這樣一個場景,數據庫的表中有一個字段表示的是產品,但是這個產品的類型是不同的,也就是說屬性不同。為了方便管理因此都使用在該字段中了,使用clob類型,保存一段對應產品類的json的字符串。json的用法可能大家都比較熟悉。
于是我在服務端打算寫這樣幾個方法。
產品類的模型:
該類表示這個通用字段,
[DataContract] public class AbstractModel { private string id; [DataMember] public string ID { get { return id; } set { id = value; } } }
這個類表示產品1的結構,
[DataContract] public class ChildModel1:AbstractModel { private string child1ID; private string child1ProductName; [DataMember] public string Child1ID { get { return child1ID; } set { child1ID = value; } } [DataMember] public string Child1ProductName { get { return child1ProductName; } set { child1ProductName = value; } } }
這個類表示產品2的結構,
[DataContract]
public class ChildModel2
{
private string child2ID;
private string child2ProductName;
[DataMember]
public string Child2ID
{
get { return child2ID; }
set { child2ID = value; }
}
[DataMember]
public string Child2ProductName
{
get { return child2ProductName; }
set { child2ProductName = value; }
}
}
服務方法如下,
契約接口,
[ServiceContract] public interface IService1 { //該方法是為了客戶端能訪問到ChildModel1的結構 [OperationContract] ChildModel1 DoGetChild1Model(); [OperationContract] ChildModel2 DoGetChild2Model(); //該方法是為了讓AbstractModel可以表示不同的產品模型 [OperationContract] AbstractModel DoGetProduct(); }
實現,
public class Service1 : IService1 { public ChildModel1 DoGetChild1Model() { ChildModel1 child1 = new ChildModel1(); child1.Child1ID = "child1"; child1.Child1ProductName = "產品1"; return child1; } public ChildModel2 DoGetChild2Model() { ChildModel2 child2 = new ChildModel2(); child2.Child2ID = "child2"; child2.Child2ProductName = "產品2"; return child2; } public AbstractModel DoGetProduct() { ChildModel1 child1 = new ChildModel1(); child1.Child1ID = "child1"; child1.Child1ProductName = "產品1"; AbstractModel abmodel = child1; return abmodel; } }
創建wcf應用程序運行,顯示WCF調試工具界面
我們先分別運行獲取產品1和產品2的方法
都正確。
運行通過父類指向的獲取產品1的方法,
報錯
所以這種用法是行不通的,如果想要獲取兩個不同的產品,則需要定義兩個對應的產品字段,分別賦值了。
我的理解依然是序列化時出錯了,序列化時應該是序列化了子類,但是恢復時是按照父類的結構恢復的所以出現異常,反序列化失敗,造成了連接斷開。
測試代碼下載
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。