为什么我不能在.NET asmx Web服务中公开接口?

时间:2010-04-05 21:40:31

标签: c# .net web-services serialization asmx

我有一个.NET Web服务(使用asmx ...还没有升级到WCF)暴露了以下内容:

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

当我尝试绑定到Web服务时,出现以下序列化错误:

无法序列化IWidget类型的成员WidgetVersion1,因为它是一个接口。

我尝试将各种属性添加到IWidget界面(XmlIgnoreSoapIgnoreNonSerialized),但它们在界面上无效。

有谁知道为什么我无法公开界面?我假设WSDL不支持接口,但是.NET不能通过简单地不对接口进行序列化来解决这个问题吗?除了从WidgetVersion1和WidgetVersion2类定义中删除IWidget接口之外,还有什么方法吗?

3 个答案:

答案 0 :(得分: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; }
}

...将序列化OK,因为序列化程序不会尝试序列化Intf属性。您无法将[XmlIgnore]属性添加到IMyInterface类型定义(它将无法编译)。

答案 1 :(得分:2)

创建一个函数AsIWigit(),它返回一个实现所述接口的私有桥类。

这将提供一种根据需要将这些类转换为适当的接口的方法,并将与ASMX服务一起使用。

答案 2 :(得分:-1)

因为接口无法序列化。

请参阅web service can't serialize an interface