C# 跨ASP.NET MVC应用程序共享数据

C# 跨ASP.NET MVC应用程序共享数据,c#,asp.net-mvc,viewbag,C#,Asp.net Mvc,Viewbag,最近,我继承了一个ASP.NET MVC 4应用程序,它使用global.asax跨视图共享数据 public class MvcApplication : System.Web.HttpApplication { public static List<Models.Feed> feedItems; public static void RegisterGlobalFilters(GlobalFilterCollection filters) {

最近,我继承了一个ASP.NET MVC 4应用程序,它使用global.asax跨视图共享数据

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
    }       
}
公共类MVCAPApplication:System.Web.HttpApplication
{
公共静态列表项;
公共静态无效注册表全局过滤器(全局过滤器集合过滤器)
{
filters.Add(新HandleErrorAttribute());
}
公共静态无效注册表项(路由收集路由)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
“默认值”,//路由名称
“{controller}/{action}/{id}”,//带参数的URL
新建{controller=“Home”,action=“Index”,id=UrlParameter.Optional}//参数默认值
);
}
受保护的无效应用程序\u Start()
{
RegisterAllAreas();
Database.DefaultConnectionFactory=newsqlconnectionfactory(@“数据源=(localdb)\v11.0;集成安全性=True;MultipleActiveResultSets=True”);
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(RouteTable.Routes);
GetDataFromWebService();//昂贵的调用
}       
}
有许多使用feedItems的视图,如:

@foreach(mvcapapplication.feedItems中的变量项)
{
  • @项目名称
  • }
    我相信上面的实现是不正确的(因为feedItems数据不会改变,除非应用程序池被回收),应该有更好的方法来做到这一点。我的要求是:

  • 调用GetDataFromWebService方法一次
  • 在多个视图中共享提要项
  • 我已经看过了,但我不确定这是否适合我的场景,因为我希望web服务只被点击一次

    最好的方法是什么


    谢谢

    如果希望每个会话获取一次变量,请将其存储在会话范围中

    Global.asax

       protected void Session_Start(Object sender, EventArgs e)
       {
          HttpContext.Current.Session["WebServiceData"] = GetDataFromWebService();
       }
    
    您可以从razor视图使用会话

    看法

    @foreach(在(IEnumerable)会话[“WebServiceData”]中的变量项)
    {
    
  • @项目.标题
  • }
    我不明白为什么这是不正确的。您希望调用该方法一次,并且按照您的方式,该方法在应用程序生命周期中调用一次。需要在每个会话中调用该方法一次,而不是在应用程序生命周期中调用该方法一次。因此,您的变量应存储在会话中,而不是静态作用域中。对于这个愚蠢的问题,我深表歉意。我的错。没有通过global.asax方法。@你的问题并不愚蠢。也许它可以被重写,以便更明确地说明您希望它如何工作。您必须了解asp.net中可用的不同作用域(会话、缓存、查询字符串、表单输入、请求…),以及为什么应该避免静态。如果您想要更好的可伸缩性,应该避免会话。
       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>
    }