Microsoft ASP.NET Redis会话状态引发异常

本文关键字:异常 会话状态 Redis ASP NET Microsoft | 更新日期: 2023-09-27 18:20:25

当使用Microsoft ASP.NET Redis会话状态提供程序将ASP.NET网站连接到Azure Redis缓存时(但使用本地Redis实例时也会发生此错误),我会得到Null引用异常。为什么?谷歌什么也没告诉我。我尝试过使用俄罗斯Redis会话状态提供程序,但它会随机破坏会话状态,所以我也不能使用它。

这是堆栈跟踪:

[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。

编辑:我很高兴,当我在MSDN论坛上发现一篇关于间歇性null引用异常的帖子时,我认为我已经找到了解决方案。我找到了一个我这样做的例子并修复了它,但这并没有真正奏效,同样的问题仍然存在。

我使用的是Microsoft.Web.RedisSessionStateProvider 0.4.0.0-Pre-121,据称它修复了类似的错误

Microsoft ASP.NET Redis会话状态引发异常

问题是我设法将Null用作键(!!)。我认为一个正确命名的常量(就像所有其他键名一样)实际上是一个null变量。

这个错误的影响差异很大,所以如果对任何人都有帮助,我会把它们贴在这里:

插入Null作为键导致ASP.NET Universal Providers会话状态提供程序和RedisAspNetProviders SessionStateProvider都工作,直到插入具有Null键的致命值后的第一次反序列化,之后,当我尝试存储List时,它们会出现HttpException(这可能是正确的,尽管可以提供一个稍微有用的错误消息)或内存不足异常,这是出乎意料的。

当插入白痴密钥时,Microsoft Redis会话状态提供程序会直接弹出NRE,我们这些白痴可能会使用更好的消息来节省时间。

在我知道错误是什么之前,我曾尝试使用Azure AppFabric作为替代方案,但它的响应不足,无法进行测试。