ASP.NET 5 сессия не длится?

Я пытаюсь заставить сеансы работать с ASP.NET 5, но они никогда не хранят данные. Похоже, что каждый вызов обновляет файл cookie сеанса до нового значения и игнорирует файл cookie, переданный клиентом.

Вот как я их настроил в ConfigureServices в Startup.cs:

// Add framework services.
services.AddMvc();
services.AddCaching();
services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromDays(30);
    options.CookieName = "MySessionCookieName";
});

И я добавил это к Configure (до app.UseMvc() как указано здесь), и попытался переместить его наверх с тем же результатом:

app.UseSession();

Попытка ввести ISession выдает ошибку, поэтому я использую HttpContext.Session как говорят документы Я написал простое действие API, которое должно установить текущую дату для ключа сеанса "сейчас", и сделать то же самое с кешем памяти, который вводится:

sw.WriteLine("_Env.EnvironmentName: {0}", _Env.EnvironmentName);
sw.WriteLine("Keys: {0}", sess.Keys.Count());
sw.WriteLine("_Session['now'] (before update): {0}", sess.GetValue<DateTime>("now"));
sess.SetValue<DateTime>("now", DateTime.Now);
sw.WriteLine("_Session['now'] (after update): {0}", sess.GetValue<DateTime>("now"));

sw.WriteLine("Cache['now'] (before setting): {0}", _Cache.Get<DateTime>("now"));
_Cache.Set<DateTime>("now", DateTime.Now);
sw.WriteLine("Cache['now'] (after setting): {0}", _Cache.Get<DateTime>("now"));

Хотя кэш памяти работает, промежуточное программное обеспечение сеанса, похоже, не работает. Когда я продолжаю перезагружать страницу, кэш "before" имеет значение, но сессия пуста:

_Env.EnvironmentName: Development
Keys: 0
_Session['now'] (before update): 1/1/0001 12:00:00 AM
_Session['now'] (after update): 3/22/2016 1:55:30 AM
Cache['now'] (before setting): 3/22/2016 1:55:25 AM
Cache['now'] (after setting): 3/22/2016 1:55:30 AM
now: "2016-03-22T01:55:30.3029954-05:00"

Просматривая вкладку сети Chrome, я вижу, что я передаю cookie с каждым запросом, но в ответе всегда устанавливается новый cookie. Есть идеи, что я могу делать не так?

1 ответ

Я использовал Session без проблем на ASP.Net 5 RC1, обновление 1. Ключевая проблема, которую я вижу в вашем коде, заключается в том, что вам нужно добавить все вещи сессий перед MVC в файле startup.cs.

Просто для полноты вот что я сделал на основе шаблона "Веб-приложение".

Добавить Microsoft.AspNet.Session

Для сеанса требуется пакет nuget https://www.nuget.org/packages/Microsoft.AspNet.Session/. Чтобы получить это, добавьте это к dependencies раздел в вашем проекте.

"Microsoft.AspNet.Session": "1.0.0-rc1-final"

В Startup.cs

Добавьте эти две строки перед services.AddMvc(); в public void ConfigureServices(IServiceCollection services)

services.AddCaching();
services.AddSession();

Добавить это раньше app.UseMvc(... в public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

app.UseSession();

Помощники строки в байт []

Прямо сейчас объект Session требует byte[] объекты, поэтому все должно быть преобразовано в / из byte[]Итак, я настроил эти две вспомогательные функции:

static byte[] StringToBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

static string BytesToString(byte[] bytes)
{
    char[] chars = new char[bytes.Length / sizeof(char)];
    System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
    return new string(chars);
}

В моем контроллере

Теперь все просто.

Установить сессию

HttpContext.Session.Set("MySessionKey", StringToBytes("fibble"));

Читать с сессии

byte[] bytes;
HttpContext.Session.TryGetValue("MySessionKey", out bytes);
var mySessionKeyValue = BytesToString(bytes);

Хотите рабочее решение?

Вы можете увидеть весь этот код, работающий в следующем репозитории GitHub: https://github.com/martinkearn/How-Happy

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