3

我想使用 ASP.NET 和 SQL Server 实现特定的目标。例如,我有几页,每页都有自己的标识(即 id=1,id=5)。此外,让我们假设对于这些 id 中的每一个,我在数据库中都有一行:

简而言之,我想要实现的是:将数据库更改直接推送到特定页面上的特定客户端,同时利用 Web 套接字(持久连接)。

例如:

第 1 行:

编号 = 1

名字 = 我的名字 1

第 2 行:

编号 = 2

名称 = 我的名字 2

我想要做的是,当特定行甚至列中的特定值发生更改时,它将触发一个事件,该事件可以仅将特定数据发送给那些正在访问具有已更改特定 id 的页面的客户端。

例如:如果第 1 行的列名从“name1”更改为“name2”,并且主键的 ID 为 5,我希望所有访问 id=5 页面的人都能在客户端收到事件。

我想阻止自己开发一个客户端代码,该代码将有争议地向 Web 服务发送请求并通过 id 查询该特定行以查看它是否已更新或特定列值已更改。

我想到的一种解决方案是将键/值保留在内存中(即内存缓存),就像键代表 id 一样,值将是更新的日期时间。然后我可以查询内存,例如,如果 [5, 05/11/2012 12:03:45] 我可以通过保存上次在客户端查询内存的时间来知道他们的数据是否上次更新,并且比较日期。如果客户端日期时间值早于内存中键/值中的值,那么我将再次查询数据库。

但是,它仍然是一种被动的方法。

让我画出它应该如何工作:

  1. 客户端和服务器具有持久连接[可以使用 ASP.NET 4.5 套接字协议完成]

  2. 服务器知道区分来自不同页面的连接,那些具有不同查询字符串的连接,例如 id=1、id=2 等。我想到的一个选项是在内存中创建一个数组,用于存储每个页面的连接 ID连接字符串 id 值。例如:{1: 2346,6767,87878, 2:876,8765,3455}。1 和 2 是页面的标识(即 id=1,id=2),其他值是我使用 ASP.net 4.5 获得的持久连接的连接 ID

  3. 主键值 id=5 的行中的列值将其列“count”从值“1”更新为“2”。

  4. 触发器调用函数并传递更改行的 id(假设值为 X)。我更喜欢能够发送特定列的值(我选择的某些列)[这是使用 CLR 触发器完成的]

  5. 该函数有一个连接列表,用于访问 id 值为 X(数字)的页面的客户端

  6. 服务器向客户端发送列值,或者如果不可能,只发送 true 或 false,通知客户端该行已发生更改。

解决到现在:

1] 可以使用 ASP.NET 4.5 套接字协议来完成

4] 使用 CLR 触发器,我可以使用一个函数来获取已更改的特定行的列数据和 id。

我正在使用 ASP.NET 4.5 开发我的应用程序。

谢谢

4

1 回答 1

1

Sql Server Service Broker can accomplish a good portion of your requirements.

Service Broker allows for async messaging in sql server. Since it's asynchronous let's split up the functionality into 2 parts.

The first part is a trigger on the table that writes a message the the service broker queue. This is just straight T-SQL, and fairly straight forward. The payload of the message is anything you can convert to varbinary(max). it could be xml, a varchar(100) that contains comma seperated values, or some other representation.

The second part is the handling of the message. You issue a transact-sql RECEIVE statement to get the next message from the queue. This statement blocks until something arrives. A queue can have multiple conversations, so each client gets their own notifications.

Conceptually, it could work like this (Client is asp.net code):

  1. Client opens Service Broker conversation .
  2. Client sends a message which says "I'm Interested in Page=3)
  3. Client does a RECEIVE which blocks indefinitely
  4. UPDATE changes data for page=3
  5. Trigger on table sends message to every conversation that is interested in Page=3
  6. Client receives the message, and sends updated data to web browser.

No CLR required, no periodic polling of the database.

于 2013-01-26T18:11:31.107 回答