ASP.NET MVC Comment sont sécurisées les variables statiques
Je veux m'assurer que mon site web est susceptible d'être hébergées dans le cloud, dans l'avenir, et aussi qu'elle peut gérer beaucoup de demandes.
Le degré de sécurité sont variables statiques?
Sont-ils dangereux parce que les demandes par les utilisateurs distincts sont en fait le partage de ces variables statiques? Ou est-ce parce que si vous étalez le site depuis plus de threads/fragmentation ou similaire, (pour gérer des charges élevées) les threads partagent les variables statiques?
Surtout que j'ai des classes d'assistance, avec des propriétés statiques, dois-je changer cette architecture de sorte que j'ai créer à la place une instance de chaque classe et de l'accès aux instances?
E. G Voici un échantillon de ce que je fais:
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()
{
}
}
}
OriginalL'auteur Baconbeastnz | 2013-01-08
Vous devez vous connecter pour publier un commentaire.
Votre code n'est pas thread-safe. Vous êtes le partage de variables statiques entre plusieurs demandes qui pourraient être exécutée par plusieurs threads. Gardez à l'esprit que la
Dictionary<TKey, TValue>
classe que vous utilisez en tant que stockage sous-jacent n'est pas thread-safe classe ce qui signifie que votre code pourrait potentiellement crash très mal si vous essayez d'appeler leOnAppInit
méthode simultanément à partir de plusieurs threads. En revanche, si vous appelez cetteOnAppInit
méthode statique qu'une seule fois à l'intérieur de votre événement Application_Start (qui est garanti pour exécuter qu'une seule fois à partir d'un seul fil) vous êtes assez sûr de l'utiliser.Cela dit en disant que les variables et méthodes statiques sont généralement une mauvaise idée dans des applications n'est pas vrai. Ils sont une mauvaise idée si vous ne savez pas comment les utiliser correctement, ou si vous ne savez pas comment faire pour synchroniser l'accès à eux si vous avez besoin de le faire à partir de threads simultanés. Écrit thread-safe code est un sujet très difficile et si vous avez peur de le faire mal (qui n'est pas lors de l'écriture d'applications multithread comme un ASP.NET la demande?) il suffit de ne pas partager l'état de ce genre. Usage bien établi des lieux pour cela, dans une ASP.NET application:
Ces lieux sont spécialement conçus pour le stockage de l'état dans un ASP.NET application (à l'exception de la première, bien sûr, qui pourrait être utilisé dans n'importe quel type d'application).
Bien que cette méthode est la modification d'une variable statique locale, qui est de type Dictionnaire. Comme je l'ai dit dans ma réponse de ce type est ce n'est pas thread-safe. Ainsi, par exemple, le premier thread va affecter une valeur pour le dictionnaire et commencer à ajouter des valeurs à quand un autre thread sera tout simplement l'affecter à un nouveau dictionnaire de perdre toutes les valeurs que le premier thread peut-être enregistré jusqu'à présent. Ce code ne devrait jamais être appelé à partir de plusieurs threads.
Merci encore Darin! Alors je vais stocker les cas, j'ai créer un objet global pour faciliter l'accès ou je vais juste avoir une statique Get() les méthodes de chaque classe qui retourne la seule instance. Cela devrait résoudre le problème. 🙂
Darin, Viens de réaliser que je ne peux pas utiliser Get() pour retourner une instance statique de la classe, de la cause qui serait de créer le même problème, où dois-je conserver mon nouveau non-statique des variables? La pensée que des propriétés d'une instance sur une sorte d'instance d'une classe globale....?
Non, ne pas penser en termes de variables. Ne pas penser en termes de classes ou de variables (statiques ou non). Pensez en termes de stockage étendues je n'ai mentionné dans ma réponse et qui sont disponibles pour vous dans un ASP.NET application. Afin de le répéter: Backend, l'État de l'Application, la mise en Cache Http Contexte, la Session, les Cookies de Client.
OriginalL'auteur Darin Dimitrov
Les variables statiques seront partagés entre les demandes.
En outre, ils seront initialisés lorsque l'application démarre,
donc, si le domaine d'application, donc l'application est redémarrée, leurs valeurs seront réinitialisés.
OriginalL'auteur Sebastian K