【问题标题】:ServiceKnownTypes Lists not working on WCF client when re-using assemblies重用程序集时,ServiceKnownTypes 列表在 WCF 客户端上不起作用
【发布时间】:2013-07-15 11:03:31
【问题描述】:

我有一个 wcf 服务,它有 3 个方法,获取项目列表、添加项目和获取单个项目。

从基类继承的可能有 4 种类型。 该服务使用每个派生类的 ServiceKnownType 进行修饰。

当我使用服务并且不选择重新使用程序集并引用 pocos 时,getlist 会按预期工作。当我重新使用程序集时,列表会引发序列化异常。

查看 wcf 客户端生成的 reference.cs 文件,我可以看到 KnownTypeAttribute 是在已生成的基类上创建的。在我重用基类的项目中,它用 ServiceKnownTypeAttribute 修饰方法。

因此,在调用 web 方法以返回列表时,我得到以下信息... 反序列化程序不知道映射到此名称的任何类型。考虑使用 DataContractResolver 或将与“TheChildObject”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。

有没有办法解决这个问题?应该很常见吧?

【问题讨论】:

    标签: c# asp.net-mvc wcf


    【解决方案1】:

    我在相关接口上面加了这么一行

    [ServiceKnownType("GetKnownTypes", typeof(KnownTypesHelper))]
    

    及实现

    public static class KnownTypesHelper
    {
        /// <summary>
        /// Lists all WCF known types
        /// </summary>
        /// <param name="provider"></param>
        /// <returns>A collection of all WCF known types</returns>
        public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
        {
            System.Collections.Generic.List<System.Type> knownTypes =
                new System.Collections.Generic.List<System.Type>();
    
            knownTypes.Add(typeof(WrntyCommon.WrntyDBEnums));
    
            // Add any types to include here.
            knownTypes.Add(typeof(AAA));
            knownTypes.Add(typeof(BBB));
            knownTypes.Add(typeof(CCC));
    
            return knownTypes;
        }
    
    }
    

    【讨论】:

    • 只需将knowtypes 属性添加到基类就可以了。我现在在服务契约接口上有 serviceknowtype,在基类上有 knowntype,它适用于两种场景
    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多