处理大量数据的WCF服务的最佳实践?

2024-03-16

我们有一个 WCF 服务,用于查询底层数据存储(现在是 SQL Server 2005)。该服务可能会返回相当大量的数据;我们的实体类有 60000 多个实例,其中包含约 20 个属性。这些属性大多是基元,例如 string、int、DateTime,其中一些属性指向其他实体,而这些实体又可能指向其他实体;但这些层次结构并不是很深。

使用此服务的应用程序通常会进行仅返回合理数量的实体(从几个实例到几千个实例)的查询。但有时它会进行一个查询,该查询将返回如上所述的大量数据(并且它需要处理该数据,因此缩小查询条件不是一个选项)。

我们想要做的是引入某种“分页”功能,客户端可以调用服务并获取一定数量的实例,然后再次调用并获取下一个块,依此类推,直到获取完整结果。由于没有大量使用 WCF,我不太确定实现这一目标的最佳方法。

也许需要记住的一件事是,在获取块时底层数据很可能会发生变化。我不太确定这对我们来说是否是一个问题(需要对此进行一些调查),但可能是,因此也欢迎任何有关处理该特定情况的意见。

我们已经开始研究流式传输响应,但也希望看到分页示例,因为我们可能希望在收到完整结果之前开始处理数据。

那么,简而言之,问题是:对于这种情况是否有最佳实践(或者我们应该注意的任何绝对禁忌)?


在客户端和服务器上使用仅具有流 [MessageBodyMember](以及作为 [MessageHeader] 发送的任何其他元数据)的 MessageContract 的流式绑定配置,可以让您在一次调用中完成整个操作,而无需担心分页(只需使用枚举器在服务器端提供流并处理出现在客户端上的各个实体),但您必须在流中滚动自己的框架(例如,使用 DataContractSerializer 或其他方式在流上手动序列化/反序列化实体)。我已经这样做了,效果很好,但有点痛苦。

如果您想要进行分页,最简单的方法是将会话 WCF 通道与快照事务结合使用(如果您使用 SQL Server 或其他支持它们作为实体源的东西)。在第一个请求上启动快照 tx,然后将 tx 的生命周期与会话联系起来,这样您就可以看到页面请求之间数据的稳定图片 - 当会话关闭时(或多次),tx 将被释放出,如果客户端意外断开连接)。然后客户端请求它看到的最后一个键值+它想要多少条记录(注意 maxReceivedMessageSize - 留下大量的空间)。由于您处于快照中,因此您不必担心更改 - 您将在转储期间看到一致的视图。如果您无法对源数据进行快照以防止其在下载过程中发生更改,那么生活就会困难得多。总是可行的,但为此进行设计是针对数据的。

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

处理大量数据的WCF服务的最佳实践? 的相关文章

  • async/await 中的 return 语句在哪里

    我可能已经让自己陷入了相当不成熟的困惑之中 请参考下面的代码 控制台应用程序 namespace Tasks101 class Program static void Main string args Program p new Progr
  • 如何正确阻止异步代码?

    我有大量以以下方式编写的代码 public string SomeSyncOperation int someArg sync code SomeAsyncOperation someArg someOtherArg ConfigureAw
  • 带有 Firebird 的 .NET 实体框架:UTF-8 数据库出现错误“超出实现限制。块大小超出实现限制”

    我将 Firebird ADO NET 提供程序版本 5 5 与实体框架 5 结合使用 对于 Firebird UTF 8 数据库 带有投影的 LINQ to SQL 查询 包括有条件地将字符串属性设置为常量 会导致错误 超出实现限制 块
  • 如何将 RTF 文件转换为 pdf 文件?

    如何将 RTF 文件转换为 PDF 文件 我有 adobe PDF 打印机 我应该使用它吗 如果是这样 我如何以编程方式访问它 您可以使用 PDF 打印机 但仍有一些问题需要解决 为了处理跨多个页面的文本 您需要本文 http msdn m
  • 静态方法是否会立即编译(JIT)?

    根据我的理解 CLR 编译器对实例方法和静态方法的处理方式相同 并且每当首次调用该方法时 IL 代码都会进行 JIT 编译 今天我和同事讨论了 他告诉我静态方法与实例方法的处理方式不同 即 静态方法在程序集加载到应用程序域后立即进行 JIT
  • Request.Url.Query 和 Request.QueryString 有什么区别?

    我一直在追踪 URL 重写应用程序上的错误 该错误表现为查询字符串中某些变音符号的编码问题 基本上 问题是基本上 search aspx search he m nek 的请求被 search he c5 99m c3 a1nek 的查询字
  • 优雅地终止 WCF 服务 - 完成所有打开的会话并限制新会话

    我有一个我编写的 WCF 服务 它托管在 Windows 服务中 它以 PerSession 模式运行 该服务允许客户端通过该服务远程打开文件 更改文件以及关闭文件 到目前为止一切工作都非常顺利 当 Windows 服务停止时 我希望能够让
  • 使用 AppDomains 并行化非线程安全 DLL

    我有一个非托管 C DLL 我的 NET 应用程序通过 p invoke 使用它 我从这个 DLL 中需要的方法相当耗时 我想并行化方法调用 问题是它使用了一堆静态和全局变量 因此它不是线程安全的 并且无法更改 我的计划是通过从多个 App
  • msmq - 触发器 - 独立可执行调用不起作用

    过去几天我一直在尝试使用 msmq 触发器来调用 exe 文件 它永远不会被调用 这些是我遵循的步骤 创建了一个提及队列路径并检查了查看的触发器 启用 选中 创建了一个不带任何条件的规则 以便每当获得新消息时都会触发触发器 并选择提到独立可
  • Linq:Select 和Where 之间有什么区别

    The Select and WhereLinq 中提供了方法 对于这两种方法 每个开发人员都应该了解什么 例如 何时使用其中一种而不是另一种 使用一种相对于另一种的优势等 Where 查找匹配的项目并仅返回匹配的项目 过滤 gt IEnu
  • Socket.*Async 方法是线程化的吗?

    我目前正在尝试找出最小化 TCP 主服务器中使用的线程数量的最佳方法 以便最大限度地提高性能 由于我最近阅读了大量 C 5 0 的新异步功能 异步并不一定意味着多线程 这可能意味着将有限状态对象分成较小的块 然后通过交替与其他操作一起进行处
  • 访问 SSIS 脚本任务静态构造函数中的可配置值

    我有一个 SSIS 包 其中包含需要第 3 方程序集的脚本任务 由于不允许我将此程序集放置在 SSIS 服务器上的 GAC 中 因此我在运行时在脚本任务的静态构造函数中绑定该程序集 这article https blogs msdn mic
  • 使用 .NET 在 Windows 中创建弹出式“烤面包机”通知

    我正在使用 NET 并创建一个桌面应用程序 服务 当触发某些事件时 它将在桌面的一角显示通知 我不想使用常规的消息框 b c 那样会造成太大的干扰 我希望通知滑入视图 然后在几秒钟后淡出 我正在考虑一种类似于 Outlook 收到新邮件时发
  • 实体框架左外连接和分组抛出:ORA-00907:缺少右括号

    我在基于实体框架的数据访问中使用实体框架来定位多个数据库 我们是一个使用 Entity Framework 已有 2 年的团队 生成的代码与 sql server 2008 完美配合 现在 我们在将数据库迁移到 Oracle 11 Expr
  • NET/COM 互操作的 ref string[] 内存泄漏

    我最近发现一个非常奇怪的 对我来说 内存泄漏IEnumString http msdn microsoft com en us library ms693735 28VS 85 29 aspxC 使用的 COM 对象 具体来说 使用已包含先
  • GC.Add MemoryPressure() 如何知道要向哪个对象添加内存压力?

    我最近需要使用GC 添加内存压力 http msdn microsoft com en us library system gc addmemorypressure aspx令我感到奇怪的是 它不接受添加内存压力的对象作为参数 我认为因为它
  • EF 和 WCF 错误 - SQL Server Compact 不适用于 ASP.NET 开发

    您好 我有一个简单的 wpf 应用程序设置来使用在另一个项目中运行的测试 wcf 服务 该服务使用实体框架从附加到 wcf 服务项目的 SQL Compact 3 5 sdf 中检索几行 我收到 SQL Server Compact 不适用
  • 在 Mono 2.8.2 中创建 WCF 服务

    我安装了 mono 2 6 7 和 WCF 服务
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 在 Java 服务器中验证 Windows 用户

    我正在开发一个用 Java 编写的服务器和一个在同一网络上的 Windows 计算机上运行的客户端 用 Net 编写的桌面应用程序 我希望进行一些基本身份验证 以便服务器可以确定运行客户端的用户的用户名 而不需要用户在客户端中重新输入其 W

随机推荐