最近,我继承了ASP.NET MVC 4应用程序,该应用程序使用global.asax跨视图共享数据。跨ASP.NET MVC应用程序共享数据
public class MvcApplication : System.Web.HttpApplication
{
public static List<Models.Feed> feedItems;
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
GetDataFromWebService(); //expensive call
}
}
有迹象表明,使用feedItems像许多观点:
@foreach (var item in MvcApplication.feedItems)
{
<li>@item.Title</li>
}
我相信上面的实现是不正确的(因为feedItems数据不会改变,除非应用程序池被回收)并且应该有更好的方法来做到这一点。我的要求是:
- 调用GetDataFromWebService方法一次。
- 跨越多个视图分享feedItems。
我看了看this SO post,但我不确定这是否适合我的情况,因为我希望Web服务仅被击中一次。
这样做的最好方法是什么?
谢谢!
我不明白为什么这是不正确。您想调用一次该方法,并按照您的方式调用该方法,在应用程序生命周期中调用该方法一次。 – Guillaume 2015-03-31 15:30:36
需要在每个会话中调用一次该方法,而不是每个应用程序生命周期调用一次。 – WhoAmI 2015-03-31 15:33:58
所以你的变量应该存储在会话中,而不是静态作用域。 – Guillaume 2015-03-31 15:35:39