我在WCF中了解ServiceKnownType的问题有些麻烦。

取自 这个博客, ,以下代码无效:

[DataContract(Namespace = “http://mycompany.com/”)]
public class Shape{…}

[DataContract(Namespace = “http://mycompany.com/”)]
public class Circle : Shape {…}

[ServiceContract]
public interface IMyServer
{
    [OperationContract]
    bool AddShape(Shape shape);
}

.

IMyServer client = new ChannelFactory<IMyServer>(binding, endPoint).CreateChannel();

client.AddShape(new Circle());

它不起作用的原因是您正在尝试添加一个圆,但是ServiceCentract仅允许形状。您应该用Newtypes做一些事情,但是我对它的工作方式有些困惑。

由于该代码在服务中,为什么不自动知道从形状派生的圆?此外,服务已知类型实际做什么?

当ServiceNonkingType放在数据合同下方时,显然这使其正常工作。我猜想这说明,这种称为Shape的特殊对象类型也可能是一个圆圈。我很难理解为什么会这样做,因为如果您添加了像Square这样的新类型,则必须为此添加到Shape类Servicennowntype。如果无法推断,将知名喜欢的人放在正方形而不是形状上是没有道理的吗?所以广场说嘿,我是一个形状,您不必摆弄形状班吗?如果您的形状类内置在库中,并且您想创建自己的钻石形状,则无法将其添加到形状类中,因为您无法访问源代码。

有帮助吗?

解决方案

问题是WCF并非进入所有组件,并试图找到所有可能的子类型。它还不会使用XML文档传输类型信息(汇编,完全合格的类型名称)。

因此,虽然在即将发出的XML上生成标签“圆”不是问题,但即将到来的Deserializater不知道该怎么办。

著名的“黑客”就像是已知类型的注册表,双方都必须实现。它是明确的。借助此注册表,Deserializer知道“ Circle”的“圆”为X型,而无需任何雄心勃勃的机会,而不必为派生类型解析所有可用或可及的组件。

请记住,Square不会说“我是形状”,它是XML标签,因此您不容易自动知道要使用哪个.NET类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top