如何在静态方法中使用会话变量?

时间:2019-07-02 08:30:22

标签: c# asp.net-core

我正在使用ASP.NET Core。如何在静态方法中使用会话变量?

在ASP.NET中,如下所示:

protected static string AssignSession()  
{
    return HttpContext.Current.Session["UserName"].ToString();
}

protected void Page_Load(object sender, EventArgs e)
{
    Session["UserName"] = "super user";
}

当我在ASP.NET Core中尝试该操作时,出现以下错误:

  

非静态字段,方法,   或属性“ ControllerBase.HttpContext”。

1 个答案:

答案 0 :(得分:4)

答案通常是:您不知道。

在ASP.NET Core中,您几乎避免使用静态代码。相反,ASP.NET Core使用dependency injection来使服务作为依赖项可用并控制它们的生存期。

ASP.NET中的静态实用程序类可能会转换为ASP.NET Core中的单例服务。使用它非常简单;您首先要创建一个可以做您想做的事的非静态服务。由于这是使用依赖注入的,因此您也可以依赖其他服务:

public class MyService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public MyService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void SetSomeSessionValue(string value)
    {
        var httpContext = _httpContextAccessor.HttpContext;

        httpContext.Session["example"] = value;
    }
}

您可以在那里做任何您想做的事情。 IHttpContextAccessor用于检索当前的HttpContext。

然后,您需要在依赖项注入容器中注册服务。您可以在ConfigureServices的{​​{1}}方法中做到这一点:

Startup.cs

现在,只需在控制器或其他服务中添加此services.AddSingleton<MyService>(); // we also add the HttpContextAccessor, in case it wasn’t already (implicitly) registered before services.AddHttpContextAccessor(); ,只需将其添加为构造函数参数即可:

MyService

现在,您有了一个非静态服务,该服务具有明确的依存关系,可以对其进行正确的测试。


说了这么多,许多构造已经可以访问当前的public class HomeController { private readonly MyService _myService; public HomeController(MyService myService) { _myService = myService; } public IActionResult Index() { _myService.SetSomeSessionValue("test"); return View(); } } 并因此可以访问会话。例如,在控制器,Razor页面甚至Razor视图中,您可以直接访问HttpContext,因为它是 instance 变量。

因此,如果您不构建一些可重用的实用程序代码,则实际上不需要为此创建服务。例如,您可以在控制器内创建一个(非静态)实用程序方法,然后直接访问HttpContext