【问题标题】:Microsoft ASP.NET Redis Session State throws an exceptionMicrosoft ASP.NET Redis 会话状态引发异常
【发布时间】:2014-10-27 22:56:43
【问题描述】:

当使用 Microsoft ASP.NET Redis 会话状态提供程序将 ASP.NET 网站连接到 Azure Redis 缓存(但使用本地 redis 实例时也会发生此错误)时,我收到空引用异常。为什么?谷歌什么也没告诉我。我曾尝试使用俄罗斯 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 论坛上发现一篇处理间歇性空引用异常的帖子时,我认为我已经找到了解决方案(嘘!),他们警告说,一个不存在的键被分配了一个空值将打破一切。我找到了一个我正在这样做并修复它的实例,但这实际上并没有起到作用,同样的问题仍然存在。

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

【问题讨论】:

  • 听起来像是 MS 代码中的错误; IIRC,我之前看过这个(单独报告),并通过 IL 在该代码中发现了一些可能的 null-ref 源。不过,您应该向 MS 团队报告。
  • 我们(Azure 缓存团队)最终无法重现该问题。是否可以向我们发送一个小型复制应用程序?您可以通过 AzureCache AT microsoft.com 与我们联系以进行进一步沟通。如果您可以联系我们,我们可以为您提供您可以使用的 pdb 文件,以便我们获得实际的行号,但有例外。
  • @Saurabh,恐怕我无法为您提供适当的重现,但看起来我们正在做一些 ASP SessionState 不同意的事情。使用竞争的 Redis 提供程序,我们避免了 NRE,但我们在应用程序的特定点(我们没有对会话做一些可怕的事情)出现损坏或内存不足异常据我们所知),这很奇怪。一旦日程安排允许,我将努力提供一个可复制的网络。
  • @hrillo666,如果“俄罗斯 Redis 会话状态提供者”来自 RedisAspNetProviders 并且您有任何问题,请向github.com/alex-simonov/RedisAspNetProviders/issues 填写错误
  • @AlexanderSimonov,是的,但正如您在下面看到的,它的行为与任何其他 SessionstateProvider 一样,所以我对此没有任何问题。围绕 ASP.NET 会话状态提供程序的框架使找到我所犯的确切错误相当困难。

标签: c# asp.net session azure redis


【解决方案1】:

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

这个错误的影响差别很大,所以如果对任何人有帮助,我会在这里发布:

将 Null 作为键插入会导致 ASP.NET Universal Providers 会话状态提供程序和 RedisAspNetProviders SessionStateProvider 工作,直到插入带有 null 键的致命值后的第一次反序列化,之后它们会因 HttpException(即可能是正确的,尽管可能会提供更有用的错误消息)或内存不足异常,当我尝试存储一个意外的列表时。

Microsoft Redis 会话状态提供程序在插入愚蠢的密钥时直接用 NRE 炸毁,而且我们这些白痴可能会使用更好的消息来节省我们的时间。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2011-09-01
    • 2011-06-07
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多