【问题标题】:Accessing Session state outside controller访问控制器外部的会话状态
【发布时间】:2019-01-27 07:54:21
【问题描述】:

我试图在控制器外部的 ASP.Net Core Web 应用程序中访问以会话状态保存的数据,但 httpcontext 始终为空,如何将状态发送到类?

我在 Startup.cs 中添加了正确的语句,以使用会话。

此外,在控制器中使用它可以很好地工作:

HttpContext.Session.SetString("Threshold",threshold);
HttpContext.Session.GetString("Treshold");

在控制器中访问时两者都可以正常工作,但我想在另一个类中访问这些数据。目前我只是使用一个静态变量,但这当然不是要走的路,我想在这里访问会话:

public class ImageAnalysisExtensionValues
{
    public static double ConfidenceThreshold { get; set; }
}

(数据已转换为双精度)。

我该怎么办?

【问题讨论】:

    标签: c# asp.net .net session asp.net-core


    【解决方案1】:

    您可以利用 Asp.Net Cores 依赖注入并使用IHttpContextAccessor 接口。

    您必须先在 Startup.cs 类中注册它(它并不总是默认注册 - 因此使用 TryAddSingleton<>()):

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
        services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        // ...
    }
    

    然后像这样使用它:

    public YourClassOutsideOfController
    {
        private IHttpContextAccessor _contextAccessor;
    
        public YourClassOutsideOfController(IHttpContextAccessor contextAccessor)
        {
            _contextAccessor = contextAccessor;
        }
    
        private void YourMethod()
        {
            var context = _contextAccessor.HttpContext;
            context.Session.SetString("Threshold",threshold);
            context.Session.GetString("Threshold");
        }
    }
    

    【讨论】:

    • 如果我的类已经有一个构造函数,只需将其添加为新的?但是如何从控制器发送信息?它只是由于会话而自动出现的吗?
    • @Zwac 现有构造函数的参数是什么?是否也可以通过依赖注入获得它们?问题是在使用依赖注入时,你必须从上到下使用它。
    • 请记住,我试图访问它的类是序列化模型类。我添加了两个构造函数,一个接受 IHttpContextAccessor,一个接受 0 个参数。我不需要序列化构造函数吗?尝试访问上下文值时,我总是得到一个“null”,所以我假设它只使用 0 arg 构造函数。
    • @Zwac 序列化模型类是什么意思?它来自哪里?
    • 不可能回答一个如此模糊的问题,我只是不知道如何解释它,但你让我意识到我真正在寻找什么。为此,我感谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2014-11-21
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多