簡體   English   中英

為什么我不能在.NET asmx Web服務中公開接口?

[英]Why can't I expose an interface in a .NET asmx web service?

我有一個.NET Web服務(使用asmx ...還沒有升級到WCF)暴露了以下內容:

public class WidgetVersion1 : IWidget {}
public class WidgetVersion2 : IWidget {}

當我嘗試綁定到Web服務時,出現以下序列化錯誤:

無法序列化IWidget類型的成員WidgetVersion1,因為它是一個接口。

我已經嘗試將各種屬性添加到IWidget接口( XmlIgnoreSoapIgnoreNonSerialized ),但它們在接口上無效。

有誰知道為什么我無法公開界面? 我假設WSDL不支持接口,但是.NET不能通過簡單地不對接口進行序列化來解決這個問題嗎? 除了從WidgetVersion1和WidgetVersion2類定義中刪除IWidget接口之外,還有什么方法嗎?

WCF也無法序列化接口; 實際上,通過SOAP序列化接口是不可能的。

原因(簡化)是,在反序列化時 ,.NET必須能夠創建一些實際的具體類。 界面是一個抽象的概念; 為了讓實際的實例存在,它背后總是必須有一個“真正的”類實現。

由於無法構造接口的物理實例,因此也無法序列化。

如果您正在嘗試使用XmlIgnoreAttribute ,請了解將其應用於該類型將無法完成任何操作。 它需要應用於成員 換一種說法:

public class SerializableClass
{
    [XmlElement]
    public int ID { get; set; }

    [XmlElement]
    public string Name { get; set; }

    [XmlIgnore]
    public IMyInterface Intf { get; set; }
}

...將序列化OK,因為序列化程序不會嘗試序列化Intf屬性。 您無法將[XmlIgnore]屬性添加到IMyInterface類型定義(它將無法編譯)。

創建一個函數AsIWigit(),它返回一個實現所述接口的私有橋類。

這將提供一種方法,根據需要將這些類轉換為適當的接口,並將與ASMX服務一起使用。

因為接口無法序列化。

請參閱Web服務無法序列化接口

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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