当使用Microsoft ASP.NET Redis会话状态提供程序将ASP.NET网站连接到Azure Redis缓存(但在使用本地Redis实例时也发生此错误)时,我得到一个空引用异常。为什么?谷歌没有告诉我什么。我曾尝试使用俄罗斯Redis会话状态提供程序,但随机会破坏会话状态,所以我也无法使用它。Microsoft ASP.NET 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论坛(booh!)处理间歇性空引用异常,他们警告一个不存在的键分配给一个空值将打破一切。我发现了一个我正在做这个并修复它的实例,但实际上并没有这个技巧,同样的问题依然存在。
我使用Microsoft.Web.RedisSessionStateProvider 0.4.0.0 - 前121涉嫌修复类似的bug
听起来像MS代码中的错误; IIRC,之前我已经看过这个(分别报告),并且通过IL在该代码中找到了一些可能的null-ref源。不过,你应该把它报告给MS团队。 – 2014-09-03 12:38:49
我们(Azure Cache团队)无法在我们的结尾重现此问题。是否有可能向我们发送一个小的repro应用程序?您可以通过AzureCache AT microsoft.com与我们联系以获得进一步的沟通。如果您可以联系我们,我们可以为您提供您可以使用的pdb文件,这样我们就可以得到实际的行号,但有例外。 – Saurabh 2014-09-03 21:14:39
@Saurabh,恐怕我不能给你一个正确的repro,但是看起来好像我们正在做一些ASP SessionState不同意的事情。使用竞争的Redis提供者,或MS通用提供者,我们避免了NRE,但是我们在应用程序的特定点出现了破坏或内存不足异常(我们可以看出,我们没有对会话做出可怕的事情) ,这很奇怪。只要计划许可,我会尽力提供一个repro网页。 – hrillo666 2014-09-05 16:22:49