【问题标题】:Access Session in Class using .Net Core 3.1 Razor Pages Application使用 .Net Core 3.1 Razor Pages 应用程序访问类中的会话
【发布时间】:2021-06-02 05:15:54
【问题描述】:

我希望从我的自定义类中检查各种会话值。我想测试的一件事是当用户点击特定页面时是否设置了 LoggedIn 变量。我想在课堂上这样做,所以我不必重复代码。

这是我注册服务/IHttpContextAccessor 的方式:

public void ConfigureServices(IServiceCollection services)
    {

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddScoped<clsSessionHelper>();

        services.AddRazorPages();
        
        services.AddMvc().AddRazorPagesOptions(options =>
        {
            options.Conventions.AddPageRoute("/App/Mpl/MplHome/MplHome", "");
        });

        services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");

        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromSeconds(1200);
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
        });          
        // End Session Support

        services.AddMemoryCache();
                   
    }

这是我构建自定义类的方式:

public class clsSessionHelper
{

    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly ISession _session;

    public clsSessionHelper(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
        _session = _httpContextAccessor.HttpContext.Session;
    }

    public string getValue(string SessionKey)
    {

        string strResult =  _session.GetString(SessionKey);

        return strResult;

    }

当我尝试在 xx.cshtml.cs 文件中使用我的助手类时,如下所示

clsSessionHelper objSessionHelper = new clsSessionHelper();                
Test = objSessionHelper.getValue("LoggedIn");

我收到一个智能感知错误“没有给出与 'clsSessionHelper.clsSessionHelper(HttpContextAccessor)' 的所需形式参数 'httpContextAccessor' 相对应的参数。

毫无疑问,我搞砸了依赖注入。任何帮助将不胜感激。

【问题讨论】:

  • 看不出为什么不起作用,但无论如何你也可以使用services.AddHttpContextAccessor()添加它
  • 您的文字显示“[...]'clsSessionHelper.clsSessionHelper(HttpContextAccessor)' 的正式参数'httpContextAccessor'”。要么是复制粘贴的,要么是代码,但不是两者兼而有之。也许你的 ctor 实际上有 (HttpContextAccessor httpContextAccessor) 而不是接口类型?

标签: c# asp.net-core dependency-injection razor-pages


【解决方案1】:

问题在于,在初始化自定义类并注入 IHttpContextAccessor 时,在请求过程中访问 HttpContext 和扩展 ISession 还为时过早

将任何依赖于HttpContext 的代码移出构造并移入在请求上下文期间调用的成员中。

public class clsSessionHelper : ISessionHelper {

    private readonly IHttpContextAccessor httpContextAccessor;        

    public clsSessionHelper(IHttpContextAccessor httpContextAccessor) {
        this.httpContextAccessor = httpContextAccessor;        
    }

    public string getValue(string SessionKey) {
        ISession session = httpContextAccessor.HttpContext.Session;
        string strResult =  session.GetString(SessionKey);
        return strResult;    
    }
}

同时抽象您的自定义类

public interface ISessionHelper  {
    string getValue(string SessionKey);
}

所以它也可以在需要的地方注入。

//...

services.AddScoped<ISessionHelper, clsSessionHelper>();

//...

避免尝试手动初始化它。

private readonly ISessionHelper objSessionHelper;                

public MyPageModel(ISessionHelper objSessionHelper) {
    this.objSessionHelper = objSessionHelper;
}

public async Task<IActionResult> OnGet() {
    var Test = objSessionHelper.getValue("LoggedIn");

    //...
}

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 2020-05-21
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2021-01-20
    • 2020-11-23
    相关资源
    最近更新 更多