2016-03-06 91 views
0

一张图片胜过千言万语:为什么私有静态变量在某个时刻变为空,我能做些什么来解决?

enter image description here

在第一页加载,结果不是空但在某些时候,一段时间后,当Gmail动作是从Javascript调用,就变成null(在这10分钟间隔呼叫之后)。它被声明为私有静态,在索引操作中被初始化,并且应该一直存在(不为空)。

我设法留在调试模式下了几个小时运行其应用程序抓住它。

谢谢。

+1

使用静态字段是一个不好的做法,以保持网络应用程序中的东西。请改用.net缓存或会话。我认为在你的情况下,该静态字段的值可能由垃圾收集器处理。实际上,您可以通过一些分析器检查它,或使用自定义一次性类型,并尝试在处理期间记录该通过。 –

回答

0

你为什么不只是保存取消标记并重新创建的Gmail()函数调用的“结果”的实例?

私人的CancellationToken记号=记号; (关于索引呼叫)

公共的ActionResult的Gmail(){ 结果=新Authresult(令牌); ... }

+0

因为我不知道你的意思。我不明白它与取消令牌有什么关系。我们正在谈论谷歌的OAuth 2.0,对吧?在Google的OAuth 2.0中没有Authresult(令牌)这样的事情。 – monstro

+0

我正在缩短它,我会编辑我的答案在几分钟内更准确。 – Noxymon

0

要诊断问题,首先要仔细检查您是否正在初始化相同的AppDomain中访问变量 - 要检查该变量是否可以添加一些日志记录。可能这是一个不同的AppDomain,因为某些事件触发了IIS AppDomain池回收。 如果是的话,那么你有两个选择:

  • 或者使用另一种机制或
  • 存储状态有一个空检查要求延迟初始化,因此该值可以在每个需要它的时候被初始化
+0

我认为这可能是 - AppDomain IIS池回收。我有重新附加扩展安装,我用它连接到IIS池,并让它在调试模式下运行。一段时间后,我回来了,发现它不再处于调试模式。这很奇怪,所以我试图再次使用该扩展重新附加,并且抛出了一条错误消息,说它无法再找到该池。我想使用会话来存储该对象,而不是静态字段,也许我会使用缓存,但不知道什么更可靠 - 会话或缓存? – monstro

+0

@monstro:缓存数据可供任何人知道密钥。会话数据仅在特定请求中可用。所以,如果你需要为不同的用户使用不同的值 - 使用会话。如果您需要在所有用户之间共享价值 - 请使用缓存。 –

+0

会话可能会过期,数据将丢失,而缓存数据可能会从其他会话访问,这可能会造成安全威胁。 这一切都取决于你的要求。 我首先选择了会议https://msdn.microsoft.com/en-us/library/ms972429前请阅读。aspx,如果它不适合 - 探索其他选项,这里简要提到https://msdn.microsoft.com/en-us/library/ms178581.aspx – ironstone13

相关问题