c# - IHttpContextAccessor 在类中为 null

标签 c# asp.net asp.net-core-2.0 httpcontext

当我尝试从 IHttpContextAccessor 获取 httpcontext 时遇到问题,类中字段始终为 null。

这是我的startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddDistributedMemoryCache();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddTransient<IUserContextServices, UserContextService>();
    services.AddSession(options =>
    {
        options.Cookie.Name = ".AdventureWorks.Session";
        options.IdleTimeout = TimeSpan.FromSeconds(10);
    });
}

这是我的 UserContext 类,它实现了 IUserContext 接口(interface)

public class UserContextService : IUserContextServices
{
    private readonly IHttpContextAccessor contextAccessor;
    PQADBContext _context = new PQADBContext();

    public UserContextService(IHttpContextAccessor accessor)
    {
        contextAccessor = accessor;
    }

   public UserContextService()
    {

    }

    public HttpContext Context
    {
        get
        {
            return contextAccessor.HttpContext;
        }
    }
   public int UserID()
    {
       return Context.Session.GetID("UserID").ConvertToInt();
    }
    public bool isLogin()
    {
        return Context.Session.GetBoolean("isLogin").ConvertToBool();
    }
      public UserAccount CreateSession(LoginViewModel logindata, bool EncryptPwd = true)
    {
        string error;
        error = "";
        try
        {
            string EncPwd = EncryptPwd ? EncryptDecryptHelper.Encrypt(logindata.Password) : logindata.Password;
            var UserDetail =_context.UserAccount.Where(e => e.P_No == logindata.PNo && e.Password == EncPwd).SingleOrDefault();


            if (UserDetail != null)
            {

                //HttpContext.Session.SetInt32()

                // ///put all the properties in session variables
                 Context.Session.SetBoolean("isLogin", true);
                Context.Session.SetID("UserID",UserDetail.AccountId);
                Context.Session.SetID("P_No",Convert.ToInt32(UserDetail.P_No));
                Context.Session.SetBoolean("isActive", true);
                Context.Session.SetBoolean("Email", true);
                Context.Session.SetID("RoleId", 1);
                Context.Session.SetString("userName", "admin"); 
   }

httpContext 在上面的类中可用,并且还设置了 session 值,但是当我尝试访问此类中的 httpcontext 时,它给了我空对象引用

public class UserService
{
   private readonly IHttpContextAccessor contextAccessor;
    public IUserContextServices _userContext = new UserContextService();
   public UserService()
    {  
    }
 public bool CreateEmployee(AppEmployees appemployee, int RoleId, bool isEmailSend, out string error)
    {
appemployee.CreatedBy = _userContext.UserID(); //this line shows null reference exception
        appemployee.CreatedDate = DateTime.Now;
}

最佳答案

您正在使用无参数构造函数新建UserContextService

public IUserContextServices _userContext = new UserContextService();

而不是依赖依赖注入(inject)。

您需要配置您的 UserService 以便与您的 DI 容器一起使用 - 通过构造函数注入(inject)

public class UserService
{
    private readonly IUserServiceContext _userServiceContext;

    public UserService(IUserServiceContext userServiceContext)
    {
        _userServiceContext = userServiceContext;
    }
}

您还需要修改 Startup.cs 以注册 UserService 并且您可能希望它也实现一个接口(interface)

关于c# - IHttpContextAccessor 在类中为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49032091/

相关文章:

c# - ASP.NET 无法使文件夹不可访问

c# - ASP.Net Core 2 如何在身份验证后触发/调用代码

angular - 如何将 Angular 6 与 .NET Core 2.0 Web API 应用程序部署到 Microsoft Azure?

c# - 在 C# 中打开 CHM(帮助文件)

c# - 在单个 ContentControl 中管理多个 View / View 模型

c# - 在 C# 中读取行而不丢失换行符

c# - Linq 匿名类型成员必须在子查询中声明

asp.net - Handles 子句需要在包含类型或其基本类型之一中定义的 WithEvents 变量

asp.net - JWT - 配置授权服务器并将颁发者设置为其本身

c# - 使用 ASP NET Core 2.0 Razor Pages 进行路由