【问题标题】:ASP.net MVC - AsyncController and SessionASP.net MVC - AsyncController 和 Session
【发布时间】:2012-01-04 16:31:04
【问题描述】:

我在 ASP.net MVC 中使用异步控制器只是为了看看它们是如何工作的。在我的一个异步操作方法中,我想通过循环几次并执行 Thread.Sleep 来模拟一个长时间运行的方法:

for(int x = 1; x <= 10; x++) {
    Thread.Sleep(1000);

    Session["progress"] = x * 10;
}

我想要一种快速而肮脏的方式来报告长时间运行的操作的进度,所以我只使用了会话状态。我不会在普通应用程序中使用它,但我注意到在另一个非异步操作方法中,此会话状态没有被持久化:

public ActionResult ReportProgress() {
    int progress = 0;

    if( Session["progress"] != null ) {
        progress = (int)Session["progress"];
    }

    return Json(progress);
}

在 ReportProgress 方法中,此会话变量始终为空。当我调试另一个异步方法时,会话正在被持久化。

有人知道为什么异步方法和同步方法似乎没有相同的会话吗?

【问题讨论】:

  • 我在问题中明确表示我不会在普通应用程序中使用 Session,但我想要一种快速而肮脏的方式来报告进度。我只是好奇为什么它不起作用。
  • 或许这篇文章能帮上忙:weblogs.asp.net/imranbaloch/archive/2011/05/10/…
  • 在 AsyncController 中 HTTPContext.Session 将被锁定,您可能需要使用 HttpContext.Application 作为解决方法!

标签: c# asp.net-mvc asynchronous


【解决方案1】:

这个链接应该给你一个想法:

Using an Asynchronous Controller in ASP.NET MVC (Working with the BeginMethod/EndMethod Pattern)

引用:

如果异步操作方法调用公开方法的服务 通过使用 BeginMethod/EndMethod 模式,回调方法(即 是,作为异步回调参数传递的方法 到 Begin 方法)可能在不在 控制 ASP.NET。在这种情况下,HttpContext.Current 将为空, 并且应用程序在访问时可能会遇到竞争条件 AsyncManager 类的成员,例如参数。确保;确定 您可以访问 HttpContext.Current 实例并避免 竞争条件,您可以通过调用恢复 HttpContext.Current 来自回调方法的 Sync()。

您在这里要做的是将结果传递给您的控制器操作的xxxCompleted 方法,使用AsyncManagaer.Paramater 字典并在那里设置会话。

您在xxxCompleted 方法中是安全的。请参阅我提供的链接。它将引导您完成整个过程。

但请记住,这种方法不是前进的方向。 ASP.NET MVC 上的异步操作将在下一个版本中发生巨大变化,await 关键字的可用性。

更多信息:

Task Support for Asynchronous Controllers

【讨论】:

  • 我的 HttpContext.Current 不为空。它只是在 Session 变量中没有任何内容。
  • 会话、上下文、请求响应等在 asp.net 请求的边界之外不可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2011-05-06
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多