【问题标题】:svcutil omits the ServiceKnownType attribute from the generated interface proxysvcutil 从生成的接口代理中省略 ServiceKnownType 属性
【发布时间】:2017-04-21 20:40:47
【问题描述】:

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

[OperationContract]
object GetItems();

[OperationContract]
Hashtable GetItems(object obj);

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

谢谢

【问题讨论】:

    标签: wcf svcutil.exe


    【解决方案1】:

    据我所知,我今天花了几个小时来解决完全相同的问题。我的解决方案是使用 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》一书中找到更多信息

    【讨论】:

      【解决方案2】:

      好像是相关的problem

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

      【讨论】:

      • 我希望它与 ServiceKnownType 而不是 KnownType 一起工作,因为在我的实际场景中,我无法在“Widget”类上添加属性,因为它位于我无法更改的 DLL 中.对于我的场景,我将不胜感激任何其他解决方案,但我也想知道为什么 MSDN 示例不起作用
      【解决方案3】:

      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));
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 2011-05-25
        • 2012-01-04
        • 2019-01-16
        相关资源
        最近更新 更多