Это приводит к тому, что кнопка выхода из системы выводит пользователя из системы примерно на 10 секунд, а затем информация о пользователе появляется снова, поэтому веб-сайт снова видит, что пользователь вошёл в систему.
Отрывки из моего кода:
Домашний контроллер:
Код: Выделить всё
[Route("logout")]
[HttpGet]
public IActionResult Logout()
{
HttpContext.Session.Clear();
return RedirectToAction("Index");
}
Код: Выделить всё
Logout[/b]
SessionExtensions.cs:
Код: Выделить всё
using Newtonsoft.Json;
#nullable enable
namespace Microsoft.AspNetCore.Http
{
public static class SessionExtensions
{
public static void SetObject(this ISession session, string key, object value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static T GetObject(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject(value);
}
}
}
Что я пробовал:
Отладка развернутого экземпляре в IIS с VS, сеанс остается очищенным (возвращает значение Null) в течение примерно 10–12 секунд после нажатия кнопки выхода из системы, затем все появляется снова, как будто оно никогда не очищалось.
Отладка проект на мой разработчик. компьютер внутри VS и не видит такого же поведения, после нажатия кнопки выхода из системы сеанс остается очищенным на неопределенный срок. (Возвращает значение Null)
Очистка файлов cookie клиентского браузера.
Перезапуск сервера с IIS и сайтом.
Удаление сайта из IIS и повторная передача опубликованных файлов, а затем добавление снова. То же самое сделал с конфигурацией публикации, установленной на «Отладка и выпуск». Никаких изменений в функциональности.
Обновление всех пакетов NuGet, а также недавнее обновление до платформы .NET 7.0.
Возможно, я что-то упускаю, так как довольно новый для страниц C#, ASP.NET Core MVC и Razor и даже для переполнения стека. Прокомментируйте, если необходимо добавить дополнительную информацию, чтобы помочь ответить на вопрос.
РЕДАКТИРОВАТЬ:
Тайм-аут сеанса (тайм-аут простоя), установленный в Program.cs всегда правильно очищает сеанс.
РЕДАКТИРОВАТЬ:
Я, вероятно, мог бы это исправить, установив для каждой переменной сеанса значение null при нажатии кнопки выхода из системы. . Но это похоже на обходной путь и может привести к ошибкам, если я добавлю еще одну переменную в будущем. Должно ли это быть решением?
РЕДАКТИРОВАТЬ:
Мое ранее упомянутое исправление установки каждой переменной в значение null не решает все проблемы. На самом деле я замечаю другие проблемы, возникающие во время сеанса. Я не могу точно определить, потому что это происходит случайным образом, иногда установка переменной сеанса не требуется, а иногда требуется, а иногда требуется временно...
Похоже, что сеанс - это просто игнорируя некоторые вызовы его методов, или когда он следует за ними, он вступает в силу только в течение 10 секунд...
РЕДАКТИРОВАТЬ:
Я пробовал все, что я мог попытаться исправить эту проблему, пока не наткнулся на это.
Код: Выделить всё
@{var IPAddress = HttpContextAccessor.HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString();
Ping pingSender = new Ping();
PingReply reply1 = pingSender.Send(IPAddress);
PingReply reply2 = pingSender.Send(IPAddress);
PingReply reply3 = pingSender.Send(IPAddress);
long[] ReplyTimes = { reply1.RoundtripTime, reply2.RoundtripTime, reply3.RoundtripTime};}
@ReplyTimes
Странная часть возникает тогда, когда еще через 10 секунд. секунды иногда он снова возвращался к последней переменной, а затем повторялся... По сути, переменная менялась сама по себе. Эта страница отладки отображается только при входе в систему, поэтому я все еще немного не понимаю, как этот код на этой странице влияет на возможность выхода из системы (очистка сеанса затем снова появляется через 10 секунд, даже если страница отладки не загружена)
Я дважды проверил, и за все время оставался только один файл cookie сеанса.
Я понятия не имею, почему удаление этого кода решило проблему. Может быть, каким-то образом доступ к удаленному IP-адресу запроса вызывает непредвиденные проблемы?
Я добавляю это как редактирование, а не как ответ, поскольку на самом деле это не дает ответа, почему это заставляет сеанс действовать так оно и есть.
Подробнее здесь: https://stackoverflow.com/questions/746 ... -when-depl