2010-04-05 47 views
7

我有一個公開以下.NET Web服務(使用ASMX ...還沒有升級到WCF還):爲什麼我無法在.NET asmx Web服務中公開接口?

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

當我嘗試綁定到Web服務,我得到下面的序列化錯誤:

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

我已經嘗試添加各種屬性的iWidget的接口(XmlIgnoreSoapIgnoreNonSerialized),但它們不是一個接口上都有效。

有誰知道爲什麼我無法公開接口?我假設WSDL不支持接口,但不能通過簡單的序列化接口來解決這個問題。除了從WidgetVersion1和WidgetVersion2類定義中移除IWidget接口之外,是否還有其他解決方法?

回答

10

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; } 
} 

...會序列確定,因爲串行不會嘗試序列化Intf財產。您不能將[XmlIgnore]屬性添加到IMyInterface類型定義(它不會編譯)。

+0

感謝您的明確解釋;它非常有意義。 – mcliedtk 2010-04-05 21:57:18

+0

我想知道是否是這種情況,然後再次閱讀這個問題,儘管他試圖使用一個有接口的類。 – Joshua 2010-04-06 02:28:24

2

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

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

+0

+1好主意讓這個 – mcliedtk 2010-04-05 21:57:41