【问题标题】:WCF stateful serviceWCF 有状态服务
【发布时间】:2012-11-08 06:31:22
【问题描述】:

或者 - 至少我认为正确的术语是有状态的。我有一个 wcf 服务,列出了很多数据给我。事实上,数据量如此之大,以至于我超过了 maxrecievedmessagesize - 并且程序崩溃了。

我开始意识到我需要拆分对数据库的调用。我需要获取第 1 - 200 行,而不是检索 5000 行,记住第 200 行的 id,从第 200 行的 id 中获取接下来的 200 行,依此类推。

有人知道怎么做吗?有状态(如“与无状态”相反)是正确的方法吗?我将如何进行……?有人能给我举个例子吗?

【问题讨论】:

  • 如果可能的话,服务应该总是无状态。基本上,您的 caller 应该负责指定他想要的行 - 1-100、101-200 等 - 服务本身不需要了解任何有关状态的信息。它只返回客户端请求的那些行。
  • @marc_s 你说得对,服务最好是无状态的,另一方面,将显式行号传递回客户端会暴露服务和底层数据库的大部分内部状态...... ,也应该避免的事情......但是,如果无论如何都返回了整行(带有id),那么你是完全正确的,所以投票给你
  • 假设我得到第 1 - 100 行,然后是 101 - 200,如果有人更改第 58 行怎么办?我不会通过使用状态来防止这种情况吗?而且 - 这是解决这类问题的最佳做法吗? (让调用者决定获取第 1 - 100 行,然后是 101 - 200)

标签: wcf stateful


【解决方案1】:

您的场景中不需要有状态服务。最好避免使用有状态服务,尤其是当您想在那里保存 5000 行时。

客户端应该指定它需要多少数据。所以它可以是GetRows(index, amount)方法,其中index是获取行的起始索引和从起始索引开始的行数。

客户端也应该询问服务的数据状态,服务只是发送数据状态。例如,当您有这 5000 行时,您可以在服务 GetRowsState(index, amount) 上使用方法,同样的故事只是说您的行的最后更新时间,当您收到的时间高于或其他客户端时,然后再次从服务器 GetRows 更新客户端数据状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多