Asp.net MVC3使用Session进行长轮询

4

我尝试在我的MVC3应用程序中实现长轮询。

以下代码可以正常工作:当线程休眠时,我可以重新加载页面而没有问题。

[AsyncTimeout(30 * 1002)]
public void TestAsync()
{
  AsyncManager.OutstandingOperations.Increment();

  var queued = ThreadPool.QueueUserWorkItem(new WaitCallback(parm =>
  {
    var wait = new AutoResetEvent(false);
    wait.WaitOne(TimeSpan.FromSeconds(30));

    AsyncManager.OutstandingOperations.Decrement();
  }));
}
//--------------------------------------------------------------------------------

public ActionResult TestCompleted()
{
  return Json(null);
}
//--------------------------------------------------------------------------------

但是如果我在应用程序中使用Sessions,比如...
this.Session["XXX"] = "Test";

当线程正在运行时,我无法重新加载页面。页面会等待线程准备就绪,然后刷新页面。

我该如何解决这个问题?


1
如果你正在这样做是因为想学习长轮询,那太棒了。但如果不是的话,可以使用SignalR。在这个领域,已经有一个现成且得到良好支持的解决方案,没有必要重新发明轮子。另外,如果你正在学习长轮询,最好花些时间研究一下SignalR的源代码。 - Shane Courtrille
1个回答

1

这不是解决您问题的方法,但可能会有所帮助。

在MVC中,您无法为单个用户会话同时执行多个请求。获取真正的异步请求的唯一方法是将控制器设置为SessionLess控制器,但这样做当然就无法读取或写入会话。

当我想要进行异步AJAX请求时,我遇到了这个问题。我认为通过将SessionStateBehaviour设置为ReadOnly,我至少可以获得对会话的只读访问权限,因为不会有并发问题,但那也行不通。

此文章有更多信息 http://weblogs.asp.net/imranbaloch/archive/2011/05/10/asynccontroller-v-s-sessionless-controller.aspx


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