Czy asp.net MVC ma zmienne aplikacji?
Jestem zajęty konwertowaniem aplikacji webowej do MVC i zapisuję pewne informacje do zmiennych aplikacji używanych w wielu lokatorach/kontach, aby zwiększyć wydajność.
Zdaję sobie sprawę, że celem MVC jest zachowanie stanu bezstanowego, oczywiście ma sens posiadanie i istnienie w MVC, ale nie chcemy po prostu konwertować aplikacji na zmienne sesji, ponieważ wolelibyśmy mieć coś bardziej globalnego i bezpieczniejszego. Czy aplikacje MVC mają zastosowanie Zmienne? Widziałem kilka przykładów, gdzie caching jest używany? Czy jest to teraz standard i jak solidne/bezpieczne jest to w porównaniu ze stanem aplikacji / sesji?
6 answers
Tak, możesz uzyskać dostęp do zmiennych aplikacji z. NET MVC. Oto jak:
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Name"] = "Value";
System.Web.HttpContext.Current.Application.UnLock();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-17 07:53:58
Stan sesji lub Pamięć podręczna są lepszym wyborem. Są one mockable w MVC i są przeznaczone do przechowywania danych sesji i aplikacji-scoped.
Klasy statyczne wydają się tu popularnym wyborem. Jednak klasy statyczne tworzą zależności między typami i utrudniają wersjonowanie/testowanie. Jest to również trochę dziwny wzorzec do użycia w ramach, które jest zaprojektowane, aby rozdzielić tego rodzaju zależności. Na przykład standard ASP.NET framework jest pełen statyki i zamknięte typy. Wszystkie one są zastępowane instancjami mock-able.
"Bezpieczny" jest nieco niejasny w tym kontekście. Co dokładnie rozumiesz przez " bezpieczne?"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 14:35:08
Zaimplementowałem coś takiego jak poniżej jako rozszerzenie dla globalnej zmiennej stanu. Umieszczam takie rzeczy jak tytuł strony,punkty końcowe usługi, autoryzowane role
public static class ApplicationStateExtension
{
public static T GetSetApplicationState<T>(this HttpApplicationState appState, string objectName, object objectValue = null, int syncCheckMinutes = 0)
{
T retVal = default(T);
appState.Lock();
if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes)
{
appState[objectName + "LastSync"] = DateTime.Now;
if (objectValue != null)
appState[objectName] = objectValue;
}
if (appState[objectName] != null)
retVal = (T)appState[objectName];
appState.UnLock();
return retVal;
}
public static object GetSetApplicationState(this HttpApplicationState appState, string objectName, object objectValue = null, int syncCheckMinutes = 0)
{
object retVal = null;
appState.Lock();
if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes)
{
appState[objectName + "LastSync"] = DateTime.Now;
if (objectValue != null)
appState[objectName] = objectValue;
}
if (appState[objectName] != null)
retVal = appState[objectName];
appState.UnLock();
return retVal;
}
public static void SetApplicationState(this HttpApplicationState appState, string objectName, object objectValue, int syncCheckMinutes = 0)
{
appState.Lock();
if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes)
{
appState[objectName + "LastSync"] = DateTime.Now;
appState[objectName] = objectValue;
}
appState.UnLock();
}
public static object GetApplicationState(this HttpApplicationState appState, string objectName)
{
object retVal = null;
appState.Lock();
if (appState[objectName] != null)
retVal = appState[objectName];
appState.UnLock();
return retVal;
}
public static T GetApplicationState<T>(this HttpApplicationState appState, string objectName)
{
T retVal = default(T);
appState.Lock();
if (appState[objectName] != null)
retVal = (T)appState[objectName];
appState.UnLock();
return retVal;
}
}
Więc mogę je ustawić z Global.asax.cs coś takiego
Application.SetApplicationState("UISiteTitle",paramHelper.GetUIConfigXML<XMLParams.UISiteOptions>("UISiteOptions")
.SiteOptionCollection.Where(v => v.name.Equals("title", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().value););
Lub
var uiPermissions = Application.GetSetApplicationState<XMLParams.UIPermissions>("UIPermissions", paramHelper.GetUIConfigXML<XMLParams.UIPermissions>("UIPermissions"), 30);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-03 17:45:20
Zrobić klasę statyczną?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 14:29:38
Czy mają zmienne aplikacji? Tak, MVC jest frameworkiem, który siedzi na normalnym asp.net ramy.
Chciałbym jednak utworzyć statyczną klasę, która używa magazynu pamięci podręcznej jako kopii zapasowej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 14:31:59
Możesz zadeklarować zmienne aplikacji w Application_Start
w następujący sposób:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
var e = "Hello";
Application["value"] = e;
}
Aby uzyskać dostęp do tego na kontrolerze napisz:
string appVar = HttpContext.Application["value"] as string;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 15:47:13