调试通过配置添加已知类型

时间:2011-03-23 21:56:50

标签: wcf serialization configuration known-types

我现在已经讨论了一段时间了,我无法弄清楚为什么我可以使用配置添加对已知类型的引用,或者如何调试它。任何指针都可能拯救我的理智。

我在Windows服务中托管了一个WCF服务,我有一个服务的配置文件。在配置中我有这个:

<configuration>
...
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="My.Full.Interface.Name, My.Assembly.Name.With.No.dll">
          <knownType type="My.Full.Implementation.Class.Name, My.Assembly.Name.With.No.dll"/>              
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
...
</configuration>

我尝试将Version=1.0.0.0,Culture=neutral,PublicKeyToken=null添加到两个声明中,但我似乎无法让数据合同序列化程序选择它们。

我已经验证了这个类可以返回(通过添加[ServiceKnownType(typeof(My.Implementation.Class))])并且可以工作,但我有另一个我想要使用的实现,如果我添加的话会在anothet程序集中创建一个循环引用它,所以不能使用它。

如何调试datacontract序列化程序找不到我的类型的原因?或者我的宣言有什么问题?

2 个答案:

答案 0 :(得分:0)

如果您正在寻找调试Windows服务的方法,可以尝试在服务启动时添加行System.Diagnostics.Debugger.Break();。我不知道这是否足够早发现为什么序列化基础设施没有拿起你的dataContractSerializer。

我看不到您发布的<system.runtime.serialization>元素中的任何错误。您是否调查了exe.config文件的其余部分是否存在语义错误?

答案 1 :(得分:0)

所以看来我的问题是我的基类型是一个交互式,而且因为KnownType属性只能应用于类,这就是它无法工作的原因。

我可以使用this answer

中的建议来解决这个问题
 [ServiceKnownType ("GetKnownTypes", typeof (KnownTypesProvider))] 

在服务接口上,然后提供一个类和方法来提供类型:

internal static class KnownTypesProvider
    {
    public static IEnumerable<Type> GetKnownTypes (ICustomAttributeProvider provider)
        {            
        return new[] {Type.GetType ("Assembly qualified type name")};
        }
    } 

还允许解析不同程序集中的类型。虽然这有效但它并不好,所以我可能最终会找到一个使用此answer中的配置的解决方案,或者将soem属性添加到我的类中并使用它来识别已知类型。