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

2023-12-07

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

问题是很容易忘记添加已知类型,如果您这样做,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);
}

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

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

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

EDIT 2 这个 MSDN 页面页面状态:

您还可以将类型添加到 ReadOnlyCollection,通过 DataContractSerializer 的 KnownTypes 属性进行访问。

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


Add [ServiceKnownType]给你的[ServiceContract]界面:

[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
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式配置 WCF 已知类型? 的相关文章

  • 是否需要连续编号?

    我正在开发一个 winform NET 应用程序 其中包括订单 发票 服务订单 票务等 这些实体在对其 ID 进行编号时是否必须按顺序排列 国际海事组织没有 以一个订单为例 它只有通过业务层才有效 在此过程中 可能已经创建了另一个订单 批准
  • 如何按顺序而不是并行等待 C# 任务?

    我有一组异步测试 它们在外部硬件上运行 我可以按顺序运行它们 但因为所有这些测试都有副作用 所以我希望能够重新排列它们并一遍又一遍地运行它们 当我将它们放入列表中并尝试等待每个之后 它们全部并行运行 而不是 1 个 1 个运行 我希望能够打
  • 使用 WPF 网络浏览器以及带有斜体标签和阿拉伯文本的 HTML 时出现奇怪的字符

    我无法弄清楚这个 但我在下面做了一个简单的演示 当在 IE 或 Edge 中查看此页面时 它会正确呈现 我尝试过不同的编码 如 utf 16 Windows 1252 但没有成功 对我来说 看起来像是 WebBrowser 控件的问题 有人
  • WPF Window 类的 IDisposable 成员

    当我将 IDisposable 类成员添加到 Windows 窗体 Form 类时 我将处置代码添加到 Form 的 Dispose 方法中 当我将 IDisposable 类成员添加到 WPF Window 类 不是 IDisposabl
  • 无法从 List 转换为 List

    我有这样的设置 abstract class Foo class Bar Foo 以及其他地方的这种形式的方法 void AddEntries List
  • 从 SpecFlow 设置 Nunit TimeoutAttribute

    我已经使用 SpecFlow 编写了几个长时间运行的端到端集成测试 但由于 Nunit 超时 它们失败了 将 Timeout x 属性添加到 TestFixture 可以解决问题 但当然每次功能更新时都会被覆盖 如何以 SpecFlow 尊
  • 如何使用 EPPlus 在单个 Excel 单元格中加载包含逗号的文本

    我正在尝试EPPlus 库 http epplus codeplex com 我被困在这个问题上 我必须在单个单元格中加载文本 但是当该文本包含逗号时 我使用的代码会沿着多个单元格 沿着正确的方向 分割文本 这是我用来加载文本的代码 usi
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 是否可以“缩放”WPF RichTextBox 中的文本?

    我注意到 WinForms RichTextBox 有一个ZoomFactor我认为这正是我想要的属性 不幸的是 WPF 变体似乎完全缺少此属性 有什么方法可以实现相同的功能 增加 减少整个文档的可见文本大小而不实际更改底层 RTF Upd
  • 如何并行运行一组函数并等待完成结果?

    我需要同时异步运行一组繁重的函数并将结果填充到列表中 这是伪代码 List
  • 为什么Windows 7无法加载程序集PresentationFramework.Aero2?

    我最近完成了我使用 Windows 8 开发的第一个 WPF 应用程序 它在我的机器上运行良好 我的一个朋友也在他的 Windows 8 机器上的 Visual Studio 中运行了它 并且成功了 我在我的机器上使用单击一次安装该程序 它
  • WF4RC,WriteLine 活动在分配给 TextWriter 的 StringWriter 上引发错误

    我是 Windows 工作流 WF 的新手 并且有兴趣出于商业目的评估 WF 我决定通过一个介绍 http msdn microsoft com en us library ee342461 aspx TestMethod public v
  • 当前有哪些 USB 设备(友好名称)连接到 PC?

    我可以获得当前连接到计算机的设备列表吗 我检查了this https stackoverflow com q 3331043 75500 and this https stackoverflow com questions 3685615
  • 如何将 Cookie 集合转换为通用列表?容易地

    任何人都知道我如何转换Request Cookies into a List
  • NewGuid 与 System.Guid.NewGuid().ToString("D");

    使用生成 GUID 时有区别吗NewGuid vs System Guid NewGuid ToString D 或者它们是同一件事 我意识到这个问题已经有了一个公认的答案 但我认为分享一些有关格式化指南的信息会很有用 The ToStri
  • LINQ -Where 表达式返回新实例还是对对象实例的引用

    对于某些人来说 这可能是一个基本问题 但它影响了我设计程序的方式 我有一个 A 类型的集合 IEnumerable a myCollection 我根据两个不同的标准过滤我的收藏 IEnumerable a subCollection1 m
  • 如何制作可修补/可更新的应用程序?

    我已经完成了一个学生项目 该项目从互联网上的 xml 文件中提取数据并将其保存到数据库并显示 我以几种不同的方式使用这些数据 例如在主页上显示在另一个选项卡中作为表格 并创建一些图表 我通过制作 5 个不同的类来完成这一切 每个类提取不同类
  • Portable 和 win-x64 在部署时有什么区别?

    我将代码部署到 Windows Server 2016 上的 IIS 我试图了解选择之间的有效区别Portable vs win x64在发布 设置 目标运行时下拉列表中 由于 JIT 需要将代码编译到特定的体系结构 站点在 Portabl
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果

随机推荐