【问题标题】:Why can't I expose an interface in a .NET asmx web service?为什么我不能在 .NET asmx Web 服务中公开接口?
【发布时间】:2011-02-04 14:22:03
【问题描述】:

我有一个 .NET Web 服务(使用 asmx...尚未升级到 WCF),它公开了以下内容:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    WCF 也不能序列化接口;事实上,不可能通过 SOAP 序列化接口。

    原因(简化)是,当反序列化时,.NET 必须能够创建一些实际的具体类。接口是一个抽象概念;为了存在一个实际的实例,它背后总是必须有一个“真实的”类实现。

    由于你不能构造一个接口的物理实例,它也不能被序列化。

    如果您尝试使用XmlIgnoreAttribute,请了解将其应用于类型 不会完成任何事情。它需要改为应用于 member。换句话说:

    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 类型定义(它不会编译)。

    【讨论】:

    • 我想知道是否是这种情况,然后再次阅读问题,尽管他试图使用具有接口的类。
    【解决方案2】:

    因为接口不能被序列化。

    web service can't serialize an interface

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-19
        • 2011-05-14
        • 1970-01-01
        • 2010-11-18
        • 2011-01-08
        • 2017-05-27
        • 2010-11-18
        • 1970-01-01
        相关资源
        最近更新 更多