私有财产改变它的价值,没有它的设定者被调用(也是跨会话).假设.NET错误

Lei*_*eif 2 c# asp.net

未来读者的更新:如果您发现此文本太长:由于静态变量,这是竞争条件.您正在阅读的内容显示,对于正在调试它并忽略static关键字的人来说,这会让您感到困惑.如果您遇到类似的行为,请先检查static.

我正在调试此应用程序,但无法在代码中找到错误.我的母版页的类有一个名为的私有属性Greeting.在同一服务器上的两个用户几乎同时注销(不到一秒钟)之前,此属性不会造成麻烦.然后一个用户获得了另一个用户的问候语(例如,如果John和Jane正在测试,他们都会看到"Dear Misses Jane!").因此,出于调试目的,我为此属性实现了一个getter和setter.两者都写入读取或写入trace.axd的值HttpContext.Current.Trace.Write().我看到设置了正确的值.但在最后get,读取相应的其他用户的值.连续两次调用getter会返回不同的值.中间没有调用setter.该属性是私有的,并且显示代码分析,不会从其他任何地方引用它.我也正在使用堆栈跟踪写入跟踪Environment.StackTrace.代码按预期运行.这与.NET本身的错误有什么不同?

    private static string _Greeting = String.Empty;
    private static string Greeting
    {
        get
        {
            System.Web.HttpContext.Current.Trace.Write("Debug", "myMasterPage.Greeting__get(): " + _Greeting);
            System.Web.HttpContext.Current.Trace.Write("Debug", "myMasterPage.Greeting__get() STACKTRACE: " + Environment.StackTrace);
            return _Greeting;
        }
        set
        {
            _Greeting = value;
            System.Web.HttpContext.Current.Trace.Write("Debug", "myMasterPage.Greeting__set(): " + _Greeting);
            System.Web.HttpContext.Current.Trace.Write("Debug", "myMasterPage.Greeting__set() STACKTRACE: " + Environment.StackTrace);
        }
    }
Run Code Online (Sandbox Code Playgroud)

跟踪摘录(带假名):

 Debug  myMasterPage.Greeting__get(): Dear Misses Jane  
 Debug  myMasterPage.Greeting__get(): Dear Mister John
Run Code Online (Sandbox Code Playgroud)

Ica*_*rus 7

问题在于这个变量是static因为当一个用户登录并且设置了值时,另一个用户登录并更改它.所以你知道,静态变量是在所有线程(请求)之间共享的变量,并且很少有你想要在Web应用程序上声明静态变量的情况.