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