2014-09-03 88 views
1

当使用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

+0

听起来像MS代码中的错误; IIRC,之前我已经看过这个(分别报告),并且通过IL在该代码中找到了一些可能的null-ref源。不过,你应该把它报告给MS团队。 – 2014-09-03 12:38:49

+0

我们(Azure Cache团队)无法在我们的结尾重现此问题。是否有可能向我们发送一个小的repro应用程序?您可以通过AzureCache AT microsoft.com与我们联系以获得进一步的沟通。如果您可以联系我们,我们可以为您提供您可以使用的pdb文件,这样我们就可以得到实际的行号,但有例外。 – Saurabh 2014-09-03 21:14:39

+0

@Saurabh,恐怕我不能给你一个正确的repro,但是看起来好像我们正在做一些ASP SessionState不同意的事情。使用竞争的Redis提供者,或MS通用提供者,我们避免了NRE,但是我们在应用程序的特定点出现了破坏或内存不足异常(我们可以看出,我们没有对会话做出可怕的事情) ,这很奇怪。只要计划许可,我会尽力提供一个repro网页。 – hrillo666 2014-09-05 16:22:49

回答

3

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

这个错误的效果相差很大,所以我将张贴在这里,如果它可以帮助任何人:

插入空作为重点引起了双方的ASP.NET通用供应商的会话状态提供者和RedisAspNetProviders SessionStateProvider,直到工作插入一个null关键字之后的第一个反序列化,之后它们会爆发一个HttpException(虽然可能会提供稍微更有帮助的错误消息,但这可能是正确的)或内存异常,当我尝试存储一个名单,这是意想不到的。

微软Redis会话状态提供程序在插入白痴密钥时直接爆发NRE,再次,我们的白痴可能会使用更好的消息来节省我们的时间。

我试图使用Azure AppFabric作为替代方法,然后才知道错误是什么,但它没有足够响应以进行测试。