我想使用ASP.NET和SQL Server实现特定的功能。例如,我有几个页面,每个页面都有自己的标识(即id = 1,id = 5)。此外,让我们假设对于每个id,我在数据库中有一行:
简而言之,我想要实现的目标是:在利用Web套接字(持久连接)的同时,将数据库更改直接推送到特定页面上的特定客户端。
例如:
第1行:
id = 1
name = myname1
第2行:
id = 2
name = myname2
我想要做的是,当列中的特定行甚至特定值发生更改时,它将触发一个事件,该事件只能将特定数据发送到正在访问具有特定ID的页面的客户端。改变。
例如:如果第1行列名从'name1'更改为'name2',并且主键的ID为5,我希望所有访问id = 5的页面的人都在客户端接收事件侧。
我想阻止自己开发一个客户端代码,该代码会有争议地将请求发送到Web服务并通过id查询该特定行,以查看它是更新还是特定列值已更改。
我想到的一个解决方案是将密钥/值保存在内存中(即memcache),就像密钥代表id一样,值将是更新的datetime lst。然后我可以查询内存,例如,[5,05 / 11/2012 12:03:45]我可以通过保存上次查询客户端内存中的内容来了解他们的数据是否上次更新了,比较日期。如果客户端日期时间值早于内存中键/值中的值,那么我将再次查询数据库。
然而,它仍然是一种被动的方式。
让我画出它应该如何运作:
客户端和服务器具有持久连接 [可以使用ASP.NET 4.5套接字协议完成]
服务器知道区分来自不同页面的连接,具有不同查询字符串的连接,例如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
主键值为id = 5的行中的列值使其“count”列从值“1”更新为“2”。
触发器调用一个函数并传递已更改行的id(让我们假设值X)。我更喜欢能够发送特定列的值(我选择的某些列) [这是使用CLR触发器完成的]
该函数有一个连接列表,用于访问id为值X(数字)的页面的客户
服务器向客户端发送列值,或者如果不可能,则发送true或false,通知客户端已对该行进行了更改。
解决至今:
1]可以使用ASP.NET 4.5套接字协议来完成
4]使用CLR触发器,我可以使用一个函数来获取已更改的特定行的列数据和id。
我正在使用ASP.NET 4.5开发我的应用程序。
由于
答案 0 :(得分:1)
Sql Server Service Broker可以满足您的大部分需求。
Service Broker允许在sql server中进行异步消息传递。由于它是异步的,我们将功能分为两部分。
第一部分是表上的触发器,它将消息写入服务代理队列。这只是直接的T-SQL,而且相当直接。消息的有效负载是您可以转换为varbinary(max)的任何内容。它可以是xml,包含逗号分隔值的varchar(100)或其他一些表示。
第二部分是消息的处理。您发出transact-sql RECEIVE语句以从队列中获取下一条消息。这个陈述阻止,直到有东西到来。队列可以有多个会话,因此每个客户端都会收到自己的通知。
从概念上讲,它可以像这样工作(客户端是asp.net代码):
不需要CLR,不定期轮询数据库。