为什么我不能在.NET asmx Web服务中公开接口?
我有一个.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服务无法序列化接口