Недавно я унаследовал приложение 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
}
}
Существует много представлений, в которых используются элементы feedItems:
@foreach (var item in MvcApplication.feedItems)
{
<li>@item.Title</li>
}
Я считаю, что приведенная выше реализация неверна (поскольку данные feedItems не изменяются, если только пул приложений не перерабатывается), и должен быть лучший способ сделать это. Мои требования:
Я посмотрел на эту публикацию, но я не уверен, подходит ли это в моем сценарии, так как я хочу, чтобы веб-сервис ударялся только один раз.
Какой был бы лучший способ сделать это?
Благодарю!
Храните переменную в области сеанса, если вы хотите получить ее один раз за сеанс.
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>
}