5

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

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

[DataContract()]
public class Machine : Widget
{
    [DataMember]
    public string Maker;
}

以及如下界面:

[ServiceKnownType(typeof(Widget))]
[ServiceKnownType(typeof(Machine))]
[ServiceContract()]
public interface ICatalog
{
    [OperationContract]
    Hashtable GetItems();
}

问题是在生成代理类时(使用“添加服务引用”/svcutil.exe),ICatalog 代理接口中省略了“ServiceKnownType”属性,导致出现异常“The formatter throw an exception while trying to反序列化消息:......将'Widget'对应的类型添加到已知类型列表中”为了解决这个问题,我必须手动将服务已知属性添加到生成的代理接口,这是一个非常糟糕的解决方案,因为代码会重新生成当我更新参考。在所有这种情况下,有趣的是,如果 GetItems 操作将返回对象而不是 Hashtable,或者将对象作为参数,那么问题将得到解决,即

[OperationContract]
object GetItems();

或者

[OperationContract]
Hashtable GetItems(object obj);

导致 IATAlog 代理接口上存在“ServiceKnownType”属性。有谁知道如何解决这个问题?

谢谢

4

3 回答 3

1

我今天花了几个小时,据我所知,这是完全相同的问题。我的解决方案是使用 IDesign 的 ServiceModelEx 库中的 AddGenericResolver 方法。

注意:需要 .NET 4.0,因为它使用DataContractResolver

您可以在IDesign 下载页面上找到它。

在我的情况下,我所要做的就是添加以下代码行:

Client.AddGenericResolver( typeof ( K2Source ) );

我希望这可以帮助其他人节省几个小时!

您可以在 Juval Lowy 所著的《Programming WCF Services: Mastering WCF and the Azure AppFabric Service Bus》一书中找到更多信息

于 2011-09-21T06:49:48.463 回答
0

似乎是一个相关的问题

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

于 2009-04-03T07:40:24.760 回答
0

svcutil 忽略 ServiceKnownType 的问题仍然存在。我的解决方案是以编程方式将“已知类型”添加到客户端合同参考:

var client = new ServiceReferenceClient("clientEndpoint");
foreach (var o in client.Endpoint.Contract.Operations)
{
   o.KnownTypes.Add(typeof(MyType01));
   o.KnownTypes.Add(typeof(MyType02));
   o.KnownTypes.Add(typeof(MyType03));
}

这不是完美的解决方案(必须在客户端硬编码),但它对我有用。

于 2017-04-21T12:40:47.930 回答