我尝试从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"属性.有谁知道如何解决这个问题?
谢谢