我正忙着将Web应用程序转换为MVC,并将一些信息保存到多个租户/帐户中使用的应用程序变量,以提高效率。
我意识到MVC的目的是让事情尽可能保持无状态,Sesion State显然有意义并且存在于MVC中,但我们不想将Application转换为Session变量,因为我们宁愿拥有更全面的东西安全。 MVC应用程序是否具有应用程序变量?我看过一些使用缓存的例子?这是现在的标准吗?与应用程序/会话状态相比,这是多么强大/安全?
答案 0 :(得分:98)
是的,您可以从.NET MVC访问应用程序变量。方法如下:
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Name"] = "Value";
System.Web.HttpContext.Current.Application.UnLock();
答案 1 :(得分:7)
会话状态或缓存是更好的选择。它们在MVC中是可模拟的,旨在存储会话和应用程序范围的数据。
静态类似乎是一个受欢迎的选择。但是,静态类会在类型之间创建依赖关系,并使版本控制/测试变得更加困难。在框架中使用它也是一种奇怪的模式,旨在打破这些类型的依赖关系。例如,标准的ASP.NET框架充满了静态和密封类型。这些都被可模拟的实例取代。
“安全”在这方面有点不清楚。究竟是什么意思“安全?”
答案 2 :(得分:4)
我实现了类似下面的全局状态变量扩展。我把像网站标题,服务端点,授权角色
这样的东西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;
}
}
所以我可以从Global.asax.cs中设置这样的东西
Application.SetApplicationState("UISiteTitle",paramHelper.GetUIConfigXML<XMLParams.UISiteOptions>("UISiteOptions")
.SiteOptionCollection.Where(v => v.name.Equals("title", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().value););
或
var uiPermissions = Application.GetSetApplicationState<XMLParams.UIPermissions>("UIPermissions", paramHelper.GetUIConfigXML<XMLParams.UIPermissions>("UIPermissions"), 30);
答案 3 :(得分:2)
制作静态课程?
答案 4 :(得分:0)
他们有应用程序变量吗?是的,MVC是一个位于普通asp.net框架之上的框架。
但是我会创建一个静态类,它使用缓存存储作为它的支持。
答案 5 :(得分:0)
您可以在Application_Start
中声明应用变量,如下所示:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
var e = "Hello";
Application["value"] = e;
}
要在控制器上访问此文件,请执行以下操作:
string appVar = HttpContext.Application["value"] as string;