Переменные сеанса.Net NullReferenceException

Я пытаюсь использовать переменные сеанса в приложении Razor Pages. Я установил пакет NuGet "Microsoft.AspNetCore.Session". Вот мой файл Startup.cs:

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Adds a default in-memory implementation of IDistributedCache.
        services.AddDistributedMemoryCache();
        services.AddSession();
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseSession();

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action=Index}/{id?}");
        });
    }

Это моя функция:

    public string GetText()
    {
        if (HttpContext.Session.GetString("_MessageText") != null)
        {
            return HttpContext.Session.GetString("_MessageText");
        }
        else
        {
            return "You found an easter egg.";
        }

    }

И я называю это так:

                <div class="col align-self-center">
                    @Message.GetText()
                </div>

Ошибка, которую я получаю для Session.GetString():

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.

Я предполагаю, что это связано с HttpContext, но я думал, что это было реализовано с app.UseSession(). У кого-нибудь есть предложения?

2 ответа

Я расскажу вам, что я делаю в проекте ASP.NET Core 2. Убедитесь, что в вашем приложении установлен следующий пакет nuget:

Microsoft.AspNetCore.Session

Добавьте следующие строки в ConfigureServices файла Startup.cs:

public void ConfigureServices(IServiceCollection services)  
{
    services.AddMvc()
        .AddSessionStateTempDataProvider();                 <=== For asp.net core 2

    services.AddDistributedMemoryCache();                   <===
    services.AddSession(options =>                          <===
    {                                                       <===
        options.IdleTimeout = TimeSpan.FromMinutes(30);     <===
        options.CookieName = ".MyApplication";              <===
    });                                                     <===
}

Добавьте следующие строки кода в файл конфигурации файла Startup.cs:

public void Configure(IApplicationBuilder app)  
{
    app.UseStaticFiles();

    //enable session before MVC
    app.UseSession();                       <===

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Теперь вы можете получить доступ к значениям сеанса из контроллера следующим образом:

string value = HttpContext.Session.GetString("value");

по вашему мнению вы можете сделать следующее:

@using Microsoft.AspNetCore.Http
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@{
    string value = HttpContextAccessor.HttpContext.Session.GetString("value");
}

В обоих случаях вы должны проверить, имеет ли указанный ключ значение.

Я надеюсь, что это помогает.

Я получил это работает. В итоге я определил этот класс:

public static class HttpHelper
{
        private static IHttpContextAccessor _accessor;
        public static void Configure(IHttpContextAccessor httpContextAccessor)
        {
            _accessor = httpContextAccessor;
        }

    public static HttpContext HttpContext => _accessor.HttpContext;
}

Я добавил эти строки в мой Startup.cs

Настройка служб:

services.AddSingleton();

В Configure я добавил:

HttpHelper.Configure (app.ApplicationServices.GetRequiredService());

и когда я звоню, я использую это:

title = HttpHelper.HttpContext.Session.GetString ("_ MessageTitle");

Его довольно сложно просто задействовать, чтобы эта базовая функциональность работала.

    public string _User_Id;

    public void ge_tUserIdFromSessions()
    {
        //in a controller you can use :         
        //_User_Id = HttpContext.Session.GetString("UserId");
        //but in a class U can use:

        var httpContextAccessor = new HttpContextAccessor();
        _User_Id = httpContextAccessor.HttpContext.Session.GetString("UserId");


    }
Другие вопросы по тегам