Задача
Значение сеанса не извлекается в представлении Razor и вызывает ошибочную логику.
Окружающая среда
Redis Sentinel с часовым на веб-серверах, но только один Redis Master и один Redis Slave. Строка подключения Redis указывает и на ведущее, и на ведомое устройство.
Код
В контроллере перед просмотром:
var fooLocal = fooMapper.Map(fooDbCall.GetFromDb(fooValue));
if (fooLocal != null)
{
Session["FooSession"] = fooLocal.fooProperty;
}
else
{
Session["FooSession"] = false;
}
В поле зрения
@if (fooRazorVal == 123)
{
// show some stuff
}
else if (!((bool?)Session["FooSession"] ?? false) && (fooRazorVal2 == 456))
{
// show error message
}
else
{
// show other stuff
}
Результат
Сообщение об ошибке отображается, даже если соответствующая учетная запись прошла через код и базу данных, чтобы проверить, что она не должна быть ложной, не говоря уже о нулевом значении. Другие значения сеанса хранятся и извлекаются нормально, иначе вы бы даже не заходили так далеко в моем процессе.
Исследование
Как я уже говорил, все остальные биты кода и база данных были проверены. Я добавил класс журналирования, и есть много записей, таких как:
[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 4686063 => Can not lock, Someone else has lock and lockId is 636901606595110722
[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 26422156 => Lock taken with lockId: 636901606595110722
[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 4686063 => Can not lock, Someone else has lock and lockId is 636901606595110722
Однако, учитывая их огромное количество, мне интересно, действительно ли это ошибка или RedisSessionStateProvider
работает так, как задумано. Я видел, что он использует SETNX
для получения замков. К сожалению, я недостаточно хорошо разбираюсь в семантике redis, чтобы понять, вызывает ли это проблему.
Я см. Примечание в документации Redis о том, что это старый подход и что вместо него используется RedLock. Однако, как я понимаю RedLock, одной настройки master / single slave недостаточно, хотя она поддерживает повторные попытки, поэтому, возможно, она все равно будет работать. Мне также любопытно, стоит ли мне использовать простой пользовательский провайдер, который позволяет StackExhange ConnectionMultiplexer
работать без дополнительных блокировок или пользовательских сценариев, и если мне нужны блокировки для использования одной из библиотек C # для RedLock.