2015-03-31 59 views
1

最近,我继承了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数据不会改变,除非应用程序池被回收)并且应该有更好的方法来做到这一点。我的要求是:

  1. 调用GetDataFromWebService方法一次。
  2. 跨越多个视图分享feedItems

我看了看this SO post,但我不确定这是否适合我的情况,因为我希望Web服务仅被击中一次。

这样做的最好方法是什么?

谢谢!

+0

我不明白为什么这是不正确。您想调用一次该方法,并按照您的方式调用该方法,在应用程序生命周期中调用该方法一次。 – Guillaume 2015-03-31 15:30:36

+0

需要在每个会话中调用一次该方法,而不是每个应用程序生命周期调用一次。 – WhoAmI 2015-03-31 15:33:58

+0

所以你的变量应该存储在会话中,而不是静态作用域。 – Guillaume 2015-03-31 15:35:39

回答

2

如果您想在每个会话中获取一次,请将变量存储在会话范围中。

的Global.asax

protected void Session_Start(Object sender, EventArgs e) 
    { 
     HttpContext.Current.Session["WebServiceData"] = GetDataFromWebService(); 
    } 

您可以从剃刀视图中使用的会话。

查看

@foreach (var item in (IEnumerable<WebServiceItem>)Session["WebServiceData"]) 
{ 
    <li>@item.Title</li> 
} 
+0

对不起,这个愚蠢的问题。我的错。没有通过global.asax方法。 – WhoAmI 2015-03-31 16:09:16

+0

@WhoAmI你的问题并不愚蠢。也许它可以被重写,以更明确地表明你如何预期它的工作。你必须了解asp.net(Session,Cache,QueryString,表单输入,Request ...)中可用的不同范围,以及为什么你应该避免静态。如果你想要更好的可伸缩性,应该避免会话。 – Guillaume 2015-04-01 07:43:57

相关问题