У меня есть проект ASP.Net vNext, который использует Session. Но я получаю эту ошибку, пытаясь получить/установить значения в сеансе.
Исключение типа 'System.InvalidOperationException' произошло в Microsoft.AspNet.Http.Core.dll, но не было обработано в коде пользователя
Дополнительная информация: сеанс не настроен для этого приложения или запроса.
Здесь мой метод контроллера:
[AllowAnonymous]
[HttpGet("/admin")]
public IActionResult Index()
{
if (Context.Session.GetString("UserName") == null) // error thrown here
{
return RedirectToAction("Login");
}
return View();
}
Я добавил пакет KVM "Microsoft.AspNet.Session": "1.0.0-beta3"
в мой файл project.json
, а также настроил мое приложение на использование сеанса через мой Startup.cs
следующим образом:
public void ConfigureServices(IServiceCollection services)
{
// code removed for brevity
services.AddCachingServices();
services.AddSessionServices();
}
public void Configure(IApplicationBuilder app)
{
app.UseMvc();
app.UseInMemorySession(configure: s => s.IdleTimeout = TimeSpan.FromMinutes(30));
}
Я просмотрел документацию vNext в Github, но он не предоставляет много информации об сеансах ASP.Net. Что я делаю неправильно?
Итак, я понял это. Исправить было довольно просто. Поскольку ASP.Net последовательно добавляет middlewares в конвейер запросов, все, что мне нужно было сделать, это использовать промежуточное программное обеспечение сеанса перед использованием MVC. Подробнее здесь: https://stackoverflow.com/questions/29420262/sessions-in-asp-net-core-1-0
Фиксированный код:
public void Configure(IApplicationBuilder app)
{
app.UseInMemorySession(configure: s => s.IdleTimeout = TimeSpan.FromMinutes(30));
app.UseMvc();
}
Благодаря @acrhistof ссылка помогла.
Итак, если вы используете RC1: добавьте эти зависимости в project.json:
"Microsoft.AspNet.Session": "1.0.0-rc1-final",
"Microsoft.Extensions.Caching.Memory": "1.0.0",
в файле Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddCaching();
services.AddSession();
services.AddMvc();
}
и
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseSession(); //outside of dev if (env.IsDevelopment())
....
}
Кажется, что все изменилось еще раз, и хорошо известный сеанс ASP.NET должен быть настроен по-разному в rc1. (UseInMemorySession()
или другие методы AppBuilder
связаны с Session
, теперь он добавляется как служба).
Обычно Session
должен быть установлен, настроен, а затем использован. Все эти шаги новы и несколько необычны. Более того, это зависит от кеша:
Сессия построена поверх
IDistributedCache
, поэтому вы должны настроить это также, в противном случае вы получите сообщение об ошибке.
Цитата выше из документов ASP.NET 5. Все, что вам нужно сделать, описано здесь: https://docs.asp.net/en/latest/fundamentals/app-state.html#installing-and-configuring-session.
app.UseSession();
передapp.UseMvc();