svcutil从生成的接口代理中省略ServiceKnownType属性

And*_*ndy 5 wcf svcutil.exe

我尝试从MSDN实现ServiceKnownType示例时遇到问题.在示例中,它们提供以下类:

[DataContract()]
public class Widget
{
    [DataMember]
    public string Id;
    [DataMember]
    public string Catalog;
}

[DataContract()]
public class Machine : Widget
{
    [DataMember]
    public string Maker;
}
Run Code Online (Sandbox Code Playgroud)

以下界面:

[ServiceKnownType(typeof(Widget))]
[ServiceKnownType(typeof(Machine))]
[ServiceContract()]
public interface ICatalog
{
    [OperationContract]
    Hashtable GetItems();
}
Run Code Online (Sandbox Code Playgroud)

问题是当生成代理类时(使用"添加服务引用"/ svcutil.exe),ICatalog代理接口中省略了"ServiceKnownType"属性,导致异常"格式化程序在尝试时抛出异常反序列化消息:...将与'Widget'对应的类型添加到已知类型列表中"为了解决此问题,我必须手动将服务已知属性添加到生成的代理接口,这是一个非常糟糕的解决方案,因为代码重新生成当我更新参考.在所有这些情况下有趣的是,如果GetItems操作将返回对象而不是Hashtable,或者将对象作为参数,则问题将得到解决,即

[OperationContract]
object GetItems();
Run Code Online (Sandbox Code Playgroud)

要么

[OperationContract]
Hashtable GetItems(object obj);
Run Code Online (Sandbox Code Playgroud)

导致ICatalog代理接口上存在"ServiceKnownType"属性.有谁知道如何解决这个问题?

谢谢

Dmi*_*sky 0

似乎是一个相关的问题

您是否尝试返回通用的小部件字典并放入[KnownType(typeof(Machine))]小部件类?

  • 我希望它与 ServiceKnownType 一起使用,而不是与 KnownType 一起使用,因为在我的实际场景中,我无法在“Widget”类上添加属性,因为它位于我无法更改的 DLL 中。我希望有任何其他适合我的场景的解决方案,但我也想知道为什么 MSDN 示例不起作用 (3认同)