При подключении веб-сайта 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, который якобы исправляет аналогичную ошибку
Проблема в том, что мне удалось использовать Null в качестве ключа (!!!). То, что я считал правильной именованной константой (как и все другие ключевые имена), было фактически переменной, которая была нулевой.
Эффекты этой ошибки значительно различались, поэтому я отправлю их здесь, если это поможет кому-либо:
Вставка Null в качестве ключа вызывала как поставщика состояния сеанса ASP.NET Universal Providers, так и RedisAspNetProviders SessionStateProvider для работы до тех пор, пока не будет вставлена первая десериализация после фатального значения с нулевым ключом, после чего они взорвутся с HttpException (что является правильным, вероятно, хотя может быть предоставлено несколько более полезное сообщение об ошибке) или исключение Out Of Memory, когда я попытался сохранить список, что является неожиданным.
Поставщик состояния сеанса Microsoft Redis запускает NRE напрямую по мере ввода идиотского ключа, и снова мы, идиоты, могли бы использовать лучшее сообщение, чтобы сэкономить время.
Я попытался использовать Azure AppFabric в качестве альтернативы, прежде чем я узнал, что такое ошибка, но он не отвечал достаточно, чтобы быть протестированным.