Переменные сеанса.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");
}