【问题标题】:Accessing session in ASP.NET app via Context通过上下文访问 ASP.NET 应用程序中的会话
【发布时间】:2017-12-06 10:04:36
【问题描述】:

我有一个 mvc 动作方法,类似于下面的构造。

public ActionResult About()
{
    System.Web.HttpContext.Current.Session["testValue"] = "about";
    ViewBag.Message = "Your application description page.";

    var sc = SynchronizationContext.Current;

    Task t = Task.Run(( ) => {

        string sessionValue = null;

        sc.Post((state)=> {
            //How do I access Session value here ?

        },null);


    });

    return View();
}

我想知道如何在sc.Post 方法中访问“会话值”?基本上,当新线程启动时,它需要访问父级的HttpSession。

【问题讨论】:

  • 你到底想达到什么目的?
  • @PatrickHofman:抱歉,更新了我的问题。

标签: c# asp.net asp.net-mvc multithreading task


【解决方案1】:

由于Session 是从当前线程派生的,因此您必须从发起请求的线程中注入会话:

var session = System.Web.HttpContext.Current.Session;

然后在你的线程委托中使用session。请注意,如果发起请求被终止,则会话可能会同时被破坏。

session["testValue"] = "abc";

【讨论】:

  • 但是,如何从state 参数中获取值?在代码示例中,sc.post 之后我很困惑如何获取会话值
  • 你在那里注入null,那你为什么要得到state
  • 可能是我没有解释清楚。 t 是一个与现有主线程并行运行的新线程。我的意图是访问线程内的会话,因为该线程t 无法访问主线程会话。因此,我将SyncronizationContext 保存在变量sc 中,并尝试从线程访问它(通过保持 sc 全局或将其传递给线程)。现在,sc.post 将读取会话数据并在回调中将数据传递给线程。我被困在了这一点上。
  • sc.Post((state)=> { var x = session["abc"]; },null);
  • 理论上,在sc.Post 内部你已经是一种“请求线程”,所以应该能够像往常一样访问会话。
猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2013-05-31
相关资源
最近更新 更多