14

我想确保我的网站将来能够托管在云上,并且它可以处理大量请求。

静态变量有多安全?

它们是否不安全,因为不同用户的不同请求实际上共享这些静态变量?或者是因为如果您将站点分布在线程/分片或类似上,(以处理高负载)线程正在共享静态变量?

主要是我有帮助类,具有静态属性,我应该改变这个架构,以便我创建每个类的实例并访问实例吗?

EG 这是我正在做的一个示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Mvc.Mailer;

namespace MVCWebsite.Helpers
{
        public class AppSettings
        {
                public static void OnAppInit()
                {
                        //General
                        AppName = "MyApp";
                        DesktopBaseURLs = new Dictionary<string, string>();
                        DesktopBaseURLs.Add("dev", "localhost:50560");
                        DesktopBaseURLs.Add("test", "www.test.whatever.com");
                        DesktopBaseURLs.Add("live", "www.whatever.com");
                        MobileBaseURLs = new Dictionary<string, string>();
                        MobileBaseURLs.Add("dev", "m.local.whatever.com");
                        MobileBaseURLs.Add("test", "m.test.whatever.com");
                        MobileBaseURLs.Add("live", "m.whatever.com");

                        //Emails
                        EmailHostName = AppName + ".com"; //For the moment atleast
                        NoReplyEmailAddress = "no-reply@" + EmailHostName.ToLower();
                        SupportEmailAddress = "support@" + EmailHostName.ToLower();
                        ErrorEmailAddress = "errors@" + EmailHostName.ToLower();

                        //Resources
                        TempFileURL = "/content/temp/";
                        UserDataURL = "/content/user-content/";
                        ProfilePicturesURL = UserDataURL + "profile-pictures/";

                        var a = GlobalHelper.GetURLAsServerPath(ProfilePicturesURL);
                        var b = a;

                }

                //General
                public static string AppName { get; set; }
                public static Dictionary<string, string> DesktopBaseURLs;
                public static Dictionary<string, string> MobileBaseURLs;

                //Emails
                public static string EmailHostName { get; set; }
                public static string NoReplyEmailAddress { get; set; }
                public static string SupportEmailAddress { get; set; }
                public static string ErrorEmailAddress { get; set; }

                //Resources
                public static string UserDataURL { get; set; }
                public static string TempFileURL { get; set; }
                public static string ProfilePicturesURL { get; set; }

                //Methods
                public static void SetAppURL()
                {

                }
        }
}
4

2 回答 2

16

您的代码不是线程安全的。您正在多个请求之间共享静态变量,这些请求可能由多个线程执行。请记住,您用作底层存储的类不是线程安全的类,这意味着如果您尝试从多个线程同时Dictionary<TKey, TValue>调用该方法,您的代码可能会严重崩溃。OnAppInit另一方面,如果您OnAppInit在 Application_Start 事件中仅调用此静态方法一次(保证仅从单个线程运行一次),那么您可以在那里使用它非常安全。

有人说静态变量和方法在应用程序中通常是一个坏主意,这是不正确的。如果您不知道如何正确使用它们,或者如果您不知道如何同步对它们的访问(如果您需要从并发线程完成此操作),那么它们是一个坏主意。编写线程安全代码是一个非常困难的主题,如果您担心会出错(在编写多线程应用程序如 ASP.NET 应用程序时谁不会出错?),请不要像这样共享状态。在 ASP.NET 应用程序中为此使用完善的位置:

  • 后端(例如可以是关系数据库)
  • 应用状态
  • 缓存
  • Http 上下文状态
  • 会话状态
  • 客户端 cookie

Those places are specifically designed for storing state in an ASP.NET application (except the first one of course which could be used in any type of application).

于 2013-01-08T22:29:46.743 回答
3

静态变量将在请求之间共享。此外,它们将在应用程序启动时被初始化,因此如果 AppDomain,即应用程序重新启动,它们的值将被重新初始化。

于 2013-01-08T22:28:55.743 回答