我尝试在我的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);
}
//--------------------------------------------------------------------------------


但是,如果我在应用程序中使用会话,如..

this.Session["XXX"] = "Test";


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

我怎么解决这个问题?

最佳答案

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

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

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

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

09-11 20:06