gpt4 book ai didi

c# - 为什么我不能在 .NET asmx Web 服务中公开接口(interface)?

转载 作者:太空狗 更新时间:2023-10-29 20:08:55 24 4
gpt4 key购买 nike

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

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

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

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

我已经尝试将各种属性添加到 IWidget 接口(interface)(XmlIgnoreSoapIgnoreNonSerialized),但它们在接口(interface)上无效.

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

最佳答案

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

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

由于您无法构造接口(interface)的物理实例,因此也无法对其进行序列化。

如果您正在尝试使用 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 类型定义(它不会编译)。

关于c# - 为什么我不能在 .NET asmx Web 服务中公开接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2581356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com