Microsoft ASP.NET Redis Session State выдает исключение

1

При подключении веб-сайта ASP.NET к кэшу Azure Redis (но эта ошибка также возникает при использовании локального экземпляра redis) с использованием поставщика ASP.NET Redis Session State из Microsoft ASP.NET, я получаю Null Reference Exception. Зачем? Google ничего мне не говорит. Я попытался использовать поставщика Redis Session State для русского языка, но это случайным образом искажает состояние сеанса, поэтому я не могу его использовать.

Это трассировка стека:

[NullReferenceException: Object reference not set to an instance of an object.]
Microsoft.Web.Redis.StackExchangeClientConnection.Eval(String script, String[] keyArgs, Object[] valueArgs) +381
Microsoft.Web.Redis.RedisConnectionWrapper.TryUpdateIfLockIdMatch(Object lockId, ISessionStateItemCollection data, Int32 sessionTimeout) +108
Microsoft.Web.Redis.RedisSessionStateProvider.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) +1280
System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +565
System.Web.SessionState.SessionStateModule.OnEndRequest(Object source, EventArgs eventArgs) +139
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69

Я понятия не имею, где эта проблема возникает, поскольку трассировка стека не касается моего кода, но она возникает на любом URL-адресе, ударяющем мой сайт после моего входа в систему, да, используя проверку подлинности форм.

Моя конфигурация redis выглядит так:

<sessionState mode="Custom" customProvider="RedisSessionStateStoreProvider">
  <providers>
    <clear />
     <add name="RedisSessionStateStoreProvider" type="Microsoft.Web.Redis.RedisSessionStateProvider, Microsoft.Web.RedisSessionStateProvider, Version=0.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
          host="*******.redis.cache.windows.net"
          throwOnError = "true" 
          connectionTimeoutInMilliseconds = "5000" 
          retryTimeoutInMilliseconds = "5000" 
          operationTimeoutInMilliseconds = "5000" 
          ssl="true"
          accessKey="*******************************"
          />
  </providers>

... где я снял ключ доступа и сервисный uri.

EDIT: Я был счастлив и думал, что нашел решение, когда нашел сообщение на форумах MSDN (booh!), В котором были рассмотрены прерывистые нулевые ссылочные исключения, в которых они предупредили, что несуществующий ключ, которому присвоено нулевое значение, сломает все. Я нашел экземпляр, где я это делал, и исправил его, но на самом деле это не трюк, и та же проблема остается.

Я использую Microsoft.Web.RedisSessionStateProvider 0.4.0.0-Pre-121, который якобы исправляет аналогичную ошибку

  • 0
    Похоже, ошибка в коде MS; IIRC, я уже рассматривал этот ранее (сообщается отдельно), и через IL нашел несколько возможных источников с нулевым номером в этом коде. Вы должны сообщить об этом команде MS, хотя.
  • 0
    Мы (команда Azure Cache) не смогли воспроизвести проблему с нашей стороны. Можно ли прислать нам небольшое приложение для воспроизведения? Вы можете связаться с нами на AzureCache AT microsoft.com для дальнейшего общения. Если вы можете связаться с нами, мы можем предоставить вам файл pdb, который вы можете использовать, чтобы мы получили фактический номер строки за исключением.
Показать ещё 3 комментария
Теги:
azure
session
redis

1 ответ

3

Проблема в том, что мне удалось использовать Null в качестве ключа (!!!). То, что я считал правильной именованной константой (как и все другие ключевые имена), было фактически переменной, которая была нулевой.

Эффекты этой ошибки значительно различались, поэтому я отправлю их здесь, если это поможет кому-либо:

Вставка Null в качестве ключа вызывала как поставщика состояния сеанса ASP.NET Universal Providers, так и RedisAspNetProviders SessionStateProvider для работы до тех пор, пока не будет вставлена первая десериализация после фатального значения с нулевым ключом, после чего они взорвутся с HttpException (что является правильным, вероятно, хотя может быть предоставлено несколько более полезное сообщение об ошибке) или исключение Out Of Memory, когда я попытался сохранить список, что является неожиданным.

Поставщик состояния сеанса Microsoft Redis запускает NRE напрямую по мере ввода идиотского ключа, и снова мы, идиоты, могли бы использовать лучшее сообщение, чтобы сэкономить время.

Я попытался использовать Azure AppFabric в качестве альтернативы, прежде чем я узнал, что такое ошибка, но он не отвечал достаточно, чтобы быть протестированным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню