【发布时间】:2011-01-31 15:44:30
【问题描述】:
我正在尝试为由 AsyncController 实现的长时间运行的请求提供进度监控机制。网页调用(通过 JQuery $.post)以下控制器上的异步 StartTask 操作...
[NoAsyncTimeout]
public class TaskController: AsyncController
{
[HttpPost]
public void StartTaskAsync()
{
AsyncManager.OutstandingOperations.Increment();
Session["progress"] = "in progress";
Task.Factory.StartNew(DoIt);
}
public ActionResult StartTaskCompleted()
{
return Json(new {redirectUrl = Url.Action("TaskComplete", "First")});
}
private void DoIt()
{
try
{
// Long-running stuff takes place here, including updating
// Session["progress"].
}
finally
{
AsyncManager.OutstandingOperations.Decrement();
}
}
}
同一网页设置了一个 2 秒的计时器(通过 window.setInterval)来调用以下对会话具有只读访问权限的控制器(通过 JQuery $.getJSON)...
[SessionState(SessionStateBehavior.ReadOnly)]
public class ProgressController: Controller
{
[HttpGet]
public ActionResult Current()
{
var data = Session["progress"];
return Json(data, JsonRequestBehavior.AllowGet);
}
}
getJSON 返回后调用的函数会更新一个 DIV 以显示当前进度。最终,进度将在会话中通过“长时间运行的东西发生在这里”代码进行更新,但由于它是对 ProgressController.Current() 的调用,因此在会话中找不到任何数据并始终返回 null。
我曾假设从同一个浏览器发送到同一个 IIS 服务器的 JQuery AJAX 请求会以相同的会话结束,但似乎并非如此。我是否需要在这些 $.post 和 $.getJSON 调用上显式设置 ASP.NET 会话密钥?还是不能以这种方式在控制器之间共享会话状态(即使一个具有 R/O 访问权限)(我可以回退到使用应用程序状态和 GUID 的稍微笨拙的解决方案)。
【问题讨论】: