【发布时间】: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