[英]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接口( XmlIgnore
, SoapIgnore
, NonSerialized
),但它們在接口上無效。
有誰知道為什么我無法公開界面? 我假設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.