2010-04-05 50 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