簡體   English   中英

使用抽象類作為方法參數的WCF服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM