ASP.NET Core HttpContext.Session.Clear() не очищает сеанс должным образом при развертывании в IISC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 ASP.NET Core HttpContext.Session.Clear() не очищает сеанс должным образом при развертывании в IIS

Сообщение Anonymous »

Языки: C# и HTML Razor внутри ASP.NET Core MVCКонтекст/проблема; Я сохраняю пользовательские информацию, используя HttpContext.Session, при отладке в Visual Studio, вызывая HttpContext.Session.Clear() в моих функциях действия выхода из системы, как и ожидалось, и очищая все переменные сеанса. Но при публикации и развертывании того же приложения в IIS при нажатии кнопки выхода переменные сеанса очищаются, но примерно через 10–12 секунд переменные сеанса появляются снова, как будто они никогда не очищались... Есть также иногда случаются случаи, когда сеанс остается очищенным, но в большинстве случаев возникает эта проблема.
Это приводит к тому, что кнопка выхода из системы выводит пользователя из системы примерно на 10 секунд, а затем информация о пользователе появляется снова, поэтому веб-сайт снова видит, что пользователь вошёл в систему.
Отрывки из моего кода:
Домашний контроллер:

Код: Выделить всё

        [Route("logout")]
[HttpGet]
public IActionResult Logout()
{
HttpContext.Session.Clear();
return RedirectToAction("Index");
}

cshtml/Razor view/page:

Код: Выделить всё

        Logout[/b]
К вашему сведению: Я использую это расширение SessionExtension, которое я нашел в Интернете, которое позволяет мне хранить объекты непосредственно в сеансе без необходимости кодировать/декодировать их вручную. Я храню информацию о пользователе в виде словаря, поэтому могу легко получить к ней доступ через HttpContextAccessor на страницах, чтобы при необходимости получить разрешения. Я выбрал это вместо доступа к базе данных каждый раз, когда для страницы требуется разрешение. Вместо этого обращайтесь к базе данных один раз при входе в систему и сохраняйте собранную информацию в сеансе. Я не уверен, что это каким-то образом является причиной этого, но я решил включить этот бит для большего контекста.
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 секунд. секунды иногда он снова возвращался к последней переменной, а затем повторялся... По сути, переменная менялась сама по себе. Эта страница отладки отображается только при входе в систему, поэтому я все еще немного не понимаю, как этот код на этой странице влияет на возможность выхода из системы (очистка сеанса затем снова появляется через 10 секунд, даже если страница отладки не загружена)
Я дважды проверил, и за все время оставался только один файл cookie сеанса.
Я понятия не имею, почему удаление этого кода решило проблему. Может быть, каким-то образом доступ к удаленному IP-адресу запроса вызывает непредвиденные проблемы?
Я добавляю это как редактирование, а не как ответ, поскольку на самом деле это не дает ответа, почему это заставляет сеанс действовать так оно и есть.

Подробнее здесь: https://stackoverflow.com/questions/746 ... -when-depl
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»