我一直在寻找在浏览器中实现类似gmail的消息传递的方法,并得出了Comet的概念.但是,我还没有找到一个很好的.NET实现,允许我在IIS中执行此操作(我们的应用程序是用ASP.NET 2.0编写的).
我找到的解决方案(或者可以想到的解决方案)需要为每个用户留下一个正在运行的线程 - 这样一旦收到消息就可以向他返回响应.当然,这根本不可扩展.
所以我的问题是 - 你知道Comet的ASP.NET实现以不同的方式工作吗?这甚至可以用于IIS吗?
我正在尝试连接AsyncController,以便当用户单击订单页面上的订单上的保存时,查看相同订单的所有用户都应该收到订单已更改的通知.我实现这一点的方法是在订单页面上进行长轮询ajax请求,但是如何制作可扩展的AsyncController来处理这个问题对我来说并不明显.
所以这就是我到目前为止,ID是指示更改或轮询更改的订单的ID.
public class MessageController : AsyncController
{
static readonly ConcurrentDictionary<int, AutoResetEvent> Events = new ConcurrentDictionary<int, AutoResetEvent>();
public ActionResult Signal(int id)
{
AutoResetEvent @event;
if (Events.TryGetValue(id, out @event))
@event.Set();
return Content("Signal");
}
public void WaitAsync(int id)
{
Events.TryAdd(id, new AutoResetEvent(false));
// TODO: This "works", but I should probably not block this thread.
Events[id].WaitOne();
}
public ActionResult WaitCompleted()
{
return Content("WaitCompleted");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经看过如何在ASP.NET MVC中进行长轮询AJAX请求?.我试图了解有关此代码的所有细节,但据我了解此代码,它阻止了线程池中的每个工作线程,据我所知,最终会导致线程饥饿.
那么,我该如何以一种漂亮,可扩展的方式实现它呢?请记住,我不想再使用任何第三方组件,我希望能够很好地理解如何正确实现此方案.