Как добавить информацию о погоде, которая будет оценена только один раз? - PullRequest
1 голос
/ 19 мая 2010

В проекте ASP.MVC (1.0) мне удалось получить информацию о погоде из RSS-канала и показать его. У меня проблема с производительностью:

Я поместил метод RenderAction () в файл Site.Master (который отлично работает), но меня беспокоит, как он будет себя вести, если пользователь нажимает на пункт меню 1, через несколько секунд в пункте меню 2, после несколько секунд в пункте 3 меню ...., таким образом, делая подачу RSS, запрашивая новую информацию снова и снова и снова!

Можно ли этого как-то избежать? (чтобы загрузить эту информацию только один раз?)

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Вы можете использовать кеш сервера:

public ActionResult Index()
{
    // try getting the weather from the cache
    object weather = HttpContext.Cache.Get("weather");

    if (weather == null)
    {
        // weather not cached => fetch it from RSS
        weather = Repository.FetchWeather();

        // store in cache for the 5 next hours
        HttpContext.Cache.Add(
            "weather", 
            weather, 
            null, 
            DateTime.Now.AddHours(5), 
            Cache.NoSlidingExpiration, 
            CacheItemPriority.Normal, 
            null
        );
    }
    return View(weather);
}
1 голос
/ 19 мая 2010

Я думаю, что если бы писал это приложение, я бы скачал информацию о погоде, сохранил бы ее локально в файле db или xml и прочитал из нее.

Погода не меняет так сильно, что вам нужно ежеминутное обновление, если вы не являетесь метеорологическим каналом или чем-то еще.

В качестве альтернативы вы можете написать это в виде потока и сделать так, чтобы он сообщал о завершении загрузки. VS 2010 делает этот кусок пирога кстати.

Таким образом, чтобы решить эту проблему, можно дать вашему коду возможность отменить запрос, и для этого вы не сможете запустить это как однопоточное приложение. Вам понадобится возможность запустить запрос в потоке и отменить его в другом запросе.

Столкнувшись с тем, что я буду размещать его локально и запускать процесс, скажем, каждый час, чтобы обновить данные из RSS-канала.

...