我正在使用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”。
答案 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
。