我的客户端/服务器应用程序使用 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/