[英]WCF Service with abstract class as method parameter
這是示例:
[ServiceKnownType("GetKnownTypes", typeof(Helper))]
[ServiceContract]
public interface ICommunicationService
{
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "/SendMessage")]
string SendMessage(BusMessage message);
}
[DataContract]
[Serializable]
public abstract class BusMessage
{
[DataMember(Name = "uid")]
public string Id { get; set; }
}
GetKnownTypes返回BusMessage的所有子類型。
如果我從wsdl生成客戶端,則一切正常。 類已正確轉換並序列化。
當我嘗試使用外部物品(例如Chrome的Postman)時,會發生問題。
我收到一個抽象類無法實例化的異常。
我注意到從客戶端進行序列化時,字段“ __type”已添加到json字符串中。
它包含如下消息類型:BusTextMessage#namespace。
我嘗試將其手動添加為另一個字段,但沒有幫助。 如何解決這樣的問題?
我不應該使用抽象類/接口作為參數嗎?
當您將“對象”發送到WCF服務時,不發送實際對象,而是對數據進行序列化和反序列化。 您可以看到,客戶端在導入服務引用時只有一個存根類,沒有任何方法和底層邏輯。
客戶端/服務嘗試創建具體類的實例,並從數據中反序列化它們。 由於無法創建抽象類的實例,因此無法通過WCF將抽象類“傳遞”給方法調用。
另外:抽象類實際上沒有任何意義,至少在您提供的示例中沒有意義。 如前所述,數據協定類中的邏輯不會傳播到客戶端,因此最好根本沒有任何邏輯(方法,復雜的獲取器/設置器)。 如果您介意的話,則無需將類abstract
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.