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);
}
//--------------------------------------------------------------------------------

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

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

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

我怎么解决这个问题?

4

1 回答 1

1

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

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

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

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

于 2012-08-03T19:55:48.567 回答