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?

Author: Mark Redman, 2010-02-15

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();
 94
Author: WWC,
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?"

 7
Author: Will,
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);
 4
Author: wchoward,
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ą?

 2
Author: svinto,
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.

 0
Author: used2could,
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;
 0
Author: Rohul Amin,
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