ASP.NET MVC-Wie sicher sind statische Variablen
Ich möchte sicherstellen, dass meine website ist in der Lage die auf der cloud in die Zukunft-und auch, dass es kann eine Menge Anfragen.
Wie sicher sind statische Variablen?
Sind Sie unsicher, da Sie gesonderte Anträge durch getrennte Benutzer sind, tatsächlich teilen Sie diese statischen Variablen? Oder ist es, weil wenn verbreiten Sie die Website über threads/Splitter oder ähnliches, (mit hohen Belastungen) die threads teilen sich die statischen Variablen?
Hauptsächlich habe ich helper-Klassen mit statischen Eigenschaften, sollte ich das ändern dieser Architektur, so dass ich stattdessen erstellen Sie eine Instanz der jeweiligen Klasse und den Zugriff auf die Instanzen?
E. G Hier ist ein Beispiel, was ich Tue:
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()
{
}
}
}
InformationsquelleAutor Baconbeastnz | 2013-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code nicht threadsicher ist. Sie sind die gemeinsame Nutzung von statischen Variablen zwischen mehreren Anfragen, die potenziell ausgeführt werden, die von mehreren threads. Beachten Sie, dass die
Dictionary<TKey, TValue>
Klasse, dass du so zugrunde liegende Lagerung ist nicht eine thread-sichere Klasse bedeutet, dass Ihr code könnte zu einem Systemabsturz führen, sehr schlecht, wenn Sie versuchen, rufen Sie dieOnAppInit
Methode gleichzeitig von mehreren threads. Wenn Sie auf der anderen Seite fordern, dieseOnAppInit
statische Methode, die nur einmal in Ihrem Application_Start-Ereignis (welches garantiert, dass Sie nur einmal von einem einzelnen thread) sind Sie ziemlich sicher, es zu verwenden.Dieses wird gesagt, zu sagen, dass statische Variablen und Methoden sind allgemein eine schlechte Idee, in Anwendungen ist das nicht wahr. Sie sind eine schlechte Idee, wenn Sie nicht wissen, wie Sie ordnungsgemäß zu verwenden, oder wenn Sie nicht wissen, wie synchronisieren Sie den Zugriff auf Sie, wenn Sie brauchen, dies zu tun aus der gleichzeitigen threads. Das schreiben einer thread-sicheren code ist ein sehr schwieriges Thema und wenn Sie haben ängste, machen es falsch (wer tut das nicht beim schreiben von Multithread-Anwendungen wie eine ASP.NET Anwendung?) einfach nicht freigeben Staat wie diesem. Verwenden Sie die etablierten Orte für diese in einem ASP.NET Anwendung:
Diese Orte sind speziell für die Speicherung der Status in einer ASP.NET Anwendung (außer dem ersten natürlich, die verwendet werden könnte in jede Art von Anwendung).
Auch diese Methode ist das modifizieren einer lokalen static-variable, die vom Typ Dictionary. Wie ich schon in meiner Antwort diese Art ist nicht thread-safe. So zum Beispiel der erste thread werden, weisen Sie einige Wert auf das Wörterbuch und starten Sie das hinzufügen von Werten zu, wenn ein anderer thread werden, weisen Sie einfach es zu einem neuen Wörterbuch zu verlieren, alle Werte, die der erste thread gespeichert haben, könnte so weit. Dieser code sollte nie aus mehreren threads aufgerufen werden.
Dank wieder Darin! Dann werde ich entweder speichern Sie die instances, die ich in einem globalen Objekt für den einfachen Zugriff auf oder ich nur eine statische Get () - Methoden in jeder Klasse gibt die einzige Instanz. Das sollte es beheben. 🙂
Darin, Nur merkte ich nicht verwenden können, Get (), um eine statische Instanz der Klasse, verursachen schaffen würde, die das gleiche problem, wo muss ich meine neue, nicht-statische Variablen? Denken Sie als Beispiel die Eigenschaften auf eine Art von Instanz einer globalen Klasse....?
Nein, nicht denken in Bezug auf die Variablen. Nicht denken in Bezug auf Klassen oder Variablen (statisch oder nicht). Denken in Bezug auf die storage-Bereiche, die ich aufgezählt habe in meiner Antwort und die verfügbar sind für Sie in einer ASP.NET -Anwendung. So, Sie zu wiederholen: - Backend -, Applikations-Zustand, Cache, Http-Kontext -, Session -, Client-Cookies.
InformationsquelleAutor Darin Dimitrov
Die statischen Variablen werden gemeinsam zwischen den Anforderungen.
Außerdem werden Sie initialisiert werden, wenn die Anwendung gestartet wird,
also, wenn die Anwendungsdomäne, damit die Anwendung wird neu gestartet, deren Werte neu initialisiert.
InformationsquelleAutor Sebastian K