使用带有SQL依赖项的C#长轮询在IIS中不一致。

4
客户的要求是,每当数据库中特定表格发生任何更改时,能够在屏幕上看到刷新后的数据。
我们在数据库中有一个Job表格,其内容在浏览器中以GridView形式显示。要求在Jobs表格中进行更新、删除或插入操作时刷新网格数据。
我们使用了SQL依赖和长轮询技术来实现这一点。SQL依赖将通知asp.net有关数据库中任何更改的情况,而长轮询将异步地保持gridview更新。
我们在IIS 7.0上部署了这个应用程序,并注意到不一致的行为,即GridView大部分时间都会刷新,比如说90-95%,但有时候即使DB表中的数据已经更改,刷新也不会发生。
有人遇到过这个问题吗?在IIS中需要特定的配置吗?我在几个地方读到过,IIS不适合Comet编程。上述情况发生在只有一个用户的测试环境中。非常感谢您的帮助。提前致谢。
编辑:这个问题似乎也出现在ASP.Net开发服务器中,而不仅仅是IIS。在记录消息后,我们发现SQLDependency是导致问题的原因,因为OnChange事件并没有被一致地触发。
编辑2:当我运行查询select * from sys.dm_qn_subscriptions时,我会得到几行相同的通知订阅,即重复的订阅。只有id列是不同的。这可能是原因吗?如果是,为什么会出现重复的订阅行?如何从ASP.NET中取消订阅?

我不确定我是否正确理解了你的设置。为什么你需要同时使用SQL依赖和长轮询?如果你使用SQL依赖,你根本不需要查询数据库,当数据库发生变化时,你的应用程序会收到通知。 - James
你尝试过记录所有更改事件,以查看是否存在特定条件未触发更改吗? - linkerro
2
在它失败的时候,你是否设法确定哪一部分出了问题?是 SqlDependency 吗?还是长轮询被剔除了?没有这些知识,这个问题是不可能回答的。个人认为,我更倾向于使用 web-sockets 和 redis-pub/sub... 但我猜这取决于你的扩展要求是什么。 - Marc Gravell
看一下SignalR和Knockout https://github.com/bdetchison/MVC---Datatables.net---Knockout.js---SignalR - JP Hellemons
或者SignalR和Backbone http://stackoverflow.com/questions/5112899/knockout-js-vs-backbone-js-vs - JP Hellemons
@MarcGravell 我们将日志消息写入文件,经过多轮测试后,我们得出结论:SQL 依赖项无法触发 Onchange 事件。值得注意的是,DELETE 操作失败次数最多,而 INSERT 和 UPDATE 操作则较少。 - StewieHere
2个回答

1

2
我认为这有点过于急躁了;首先,原帖的作者应该确认是长轮询出了问题……然后才有很多选择,其中这只是其中之一。 - Marc Gravell
@Marc :是的,还有其他选择,这只是我的个人意见,对我来说很有效 :) - Buzz

0

你需要做的第一件事是检查 dbo.AspNet_SqlCacheTablesForChangeNotification 表。每个表都有缓存失效计数器。 如果数字没问题(100% 增量没有损失),考虑检查 UI 层。


我在我们的数据库中没有看到这个表。是因为我们没有使用SQLCacheDependency吗? - StewieHere
是的。要启用SQL缓存依赖项,您应该使用aspnet_regsql实用程序。首先为数据库启用此功能,然后应用于您想要的所有表。您可以在http://www.codeproject.com/Articles/14976/ASP-NET-Caching-Dependencies了解更多信息。 - eugenesqr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接