gpt4 book ai didi

wcf - svcutil 从生成的接口(interface)代理中省略 ServiceKnownType 属性

转载 作者:行者123 更新时间:2023-12-03 17:21:42 26 4
gpt4 key购买 nike

当我尝试从 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代理接口(interface)中省略了“ServiceKnownType”属性,导致获取异常
“格式化程序在尝试反序列化消息时抛出异常:......
将 'Widget' 对应的类型添加到已知类型列表中”
为了解决这个问题,我必须手动将服务已知属性添加到生成的代理接口(interface),这是一个非常糟糕的解决方案,因为当我更新引用时代码会重新生成。
在所有这种情况下,有趣的是,如果 GetItems 操作将返回对象而不是 Hashtable,或者将对象作为参数,那么问题将得到解决,即
[OperationContract]
object GetItems();

或者
[OperationContract]
Hashtable GetItems(object obj);

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

谢谢

最佳答案

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

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

您可以在 IDesign Downloads page 上找到它.

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

Client.AddGenericResolver( typeof ( K2Source ) );

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

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

关于wcf - svcutil 从生成的接口(interface)代理中省略 ServiceKnownType 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/712849/

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