【问题标题】:Using static variables in C# Web Application - Accessing Session variables in class properties在 C# Web 应用程序中使用静态变量 - 在类属性中访问 Session 变量
【发布时间】:2018-08-20 08:17:42
【问题描述】:

请原谅我缺乏编码知识以及提出正确问题的能力。

我对这个 ASP.Net Web 应用程序(核心)相当陌生,但我仍然想知道..

在我当前的应用程序中,我有一个类,它有一个属性,它从静态变量中获取,当用户请求控制器时设置。所以流程是:用户发送请求,body中带有变量,如果body中没有指定,则将StaticClass.StaticProperty(示例)设置为用户在body中指定的变量(或默认= 0),返回数据基于变量。 然而我想知道,由于这个变量没有线程保证,当 Web 应用程序一次收到 50,000 个请求时,是否可以更改或搞砸?

我查看了会话并尝试了以下方法:

service.AddSession(); //Not sure this even does anything?
HttpContext.Session.SetString //Setting this works in the controller, but I cant access it elsewhere by GetString
System.Web.HttpContext.Current.Session["test"] // Cant even access System.Web.Httpcontext, doesn't seem to exist.
HttpContext.Current //doesn't exist either
Session["test"] //doesn't exist either

我可以将会话发送到某个地方吗?我很迷茫。

不确定这是否有意义,如果需要,我会尝试详细说明。

提前谢谢你。

编辑:更新信息。

我已将此添加到我的 startup.cs: services.AddSingleton();

        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
        });

        app.UseSession();

设置会话变量: https://i.imgur.com/CY8rcdk.png

使用 Session 变量: https://i.imgur.com/SuLJKzV.png

变量始终为空。

感谢您的帮助。

【问题讨论】:

  • 你在哪里尝试过这些东西?控制器?其他课程?
  • 我设置了 HttpContext.Session.SetString("Test",test);在控制器中,我尝试在另一个类中访问它。
  • 您是否进行了设置以在您的启动中设置会话? docs.microsoft.com/en-us/aspnet/core/fundamentals/…
  • 我做到了,我按照完全相同的说明进行操作。
  • 好的,现在你在做什么更清楚了。因此,您正在使用 Razor 页面,并尝试从那里访问会话。哪个应该工作。您可以在设置值后立即尝试在控制器中执行 Session Get。让我们看看它是否甚至没有设置值,或者它在过程中的某个地方丢失了。

标签: c# asp.net session static


【解决方案1】:

HttpContext 只能从特定于请求的事物中访问,因为它是一个且唯一的请求的上下文。框架为每个请求创建新的控制器实例,并注入 HttpContext。如果需要,开发人员的工作就是进一步传递它。

我推荐阅读这篇关于它的文章:https://dotnetcoretutorials.com/2017/01/05/accessing-httpcontext-asp-net-core/

首先在你的 startup.cs 中,你需要像这样将 IHttpContextAccessor 注册为一个服务:

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

当您创建一个助手/服务类时,您可以注入 IHttpContextAccessor 并使用它。它看起来和这个不太相似:

public class UserService : IUserService
{
  private readonly IHttpContextAccessor _httpContextAccessor;

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

  public bool IsUserLoggedIn()
  {
    var context = _httpContextAccessor.HttpContext;
    return context.User.Identities.Any(x => x.IsAuthenticated);
  }
}

【讨论】:

  • 似乎这可能是我正在寻找的,但无论我在哪里使用此方法访问上下文,它始终设置为“null”。
  • 让我换种说法,我真正需要做的就是为用户保存一个会话变量,然后在另一个类中访问它。
  • 这应该可以。添加有关您如何操作的代码。首先是 Startup.cs 类,即您在会话中设置某些内容的控制器。还有一堂课,你可以从会话中得到一些东西。
  • 是否不可能创建一个 WebUser 的实例来保存上下文,然后在另一个类中调用 WebUser 来获取 httpcontext?我只是真的想避免静态,而您之前发送的答案似乎不适合我的代码。
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
相关资源
最近更新 更多