.net - 如何以编程方式配置 WCF 已知类型?

标签 .net wcf wcf-configuration known-types

我的客户端/服务器应用程序使用 WCF 进行通信,这非常棒。然而,当前架构的一个缺点是我必须对某些传输类型使用已知类型配置。我正在使用内部 Pub/Sub 机制,这个要求是不可避免的。

问题是很容易忘记添加已知类型,如果您这样做,WCF 会默默地失败,几乎没有任何线索表明出了什么问题。

在我的应用程序中,我知道要发送的类型集。我想以编程方式执行配置,而不是通过当前包含以下内容的 App.config 文件以声明方式执行配置:

<system.runtime.serialization>
  <dataContractSerializer>
    <declaredTypes>
      <add type="MyProject.MyParent, MyProjectAssembly">
        <knownType type="MyProject.MyChild1, MyProjectAssembly"/>
        <knownType type="MyProject.MyChild2, MyProjectAssembly"/>
        <knownType type="MyProject.MyChild3, MyProjectAssembly"/>
        <knownType type="MyProject.MyChild4, MyProjectAssembly"/>
        <knownType type="MyProject.MyChild5, MyProjectAssembly"/>
      </add>
    </declaredTypes>
  </dataContractSerializer>
</system.runtime.serialization>

相反,我想做这样的事情:

foreach (Type type in _transmittedTypes)
{
    // How would I write this method?
    AddKnownType(typeof(MyParent), type);
}

有人可以解释一下我该怎么做吗?

编辑请理解,我试图在运行时动态设置已知类型,而不是在配置中以声明方式或在源代码中使用属性。

这基本上是一个关于 WCF API 的问题,而不是一个风格问题。

编辑 2 This MSDN page页面状态:

You can also add types to the ReadOnlyCollection, accessed through the KnownTypes property of the DataContractSerializer.

不幸的是,这就是它所说的全部内容,并且考虑到 KnownTypes 是一个只读属性,并且该属性的值是一个 ReadOnlyCollection,它没有多大意义。

最佳答案

添加[ServiceKnownType]到您的[ServiceContract]接口(interface):

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

然后创建一个名为KnownTypesProvider的类:

internal static class KnownTypesProvider
{
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
    {
         // collect and pass back the list of known types
    }
}

然后你可以传回你需要的任何类型。

关于.net - 如何以编程方式配置 WCF 已知类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/771560/

相关文章:

c# - 使用内存流将二进制转换为位图

c# - 没有 System.Web 的 HTML 解码

.net - SOAP Web 服务 (.net) 中数据库连接的正确位置

c# - Geo-Tiff 到 ECW 转换?

c# - 找不到具有名称和契约(Contract)的端点元素

c# - 在服务之间共享数据

wcf - MVC2 路由与 WCF ServiceRoute : Html. ActionLink 呈现不正确的链接!

.net - WCF 服务 - 使用用户名身份验证的证书和消息安全

c# - servicePrincipalName 应该有什么值?