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

时间:2012-08-03 12:14:11

标签: asp.net-mvc asp.net-mvc-3 session long-polling

我尝试在我的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";

线程运行时我无法重新加载页面。 Page等待单元线程准备就绪,然后页面将刷新。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

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

我想在做异步AJAX请求时遇到这个问题。我想通过将SessionStateBehaviour设置为ReadOnly我至少可以获得对会话的只读访问权限,因为不会出现并发问题,但这也不起作用。

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