かなり重いと思われるアクション結果があるので、パフォーマンスを向上させるために最適化するにはどうすればよいでしょうか。この Web アプリケーションは、+100,000 人のユーザーが同時に使用します。
現在、私の Actionresult は次のことを行います。
- インターネット URL から XML ファイルを取得する
- xml データを DB に入力します
- DB データがビューモデルを満たす
- モデルをビューに返します
この 4 つの関数は、ユーザーがビューにアクセスするたびにトリガーされます。これが、この Actionresult の作成が非常に悪いと思う理由です。
この次のものを Actionresults に追加するにはどうすればよいですか?
XML ファイルを取得して xml データを DB に入力するタイマーを追加します (10 分ごとなど)。これにより、ユーザーがビューにアクセスするたびにタイマーがトリガーされることはありません。ユーザーがサイトにアクセスするたびにトリガーする必要がある唯一の関数は、viewmodel バインディングとモデルを返すことです。どうすればこれを達成できますか?
ノート:
- xml ファイルは、約 10 分ごとに新しいデータで更新されます。
- 私は約50のアクション結果を持っています.xmlデータを取得してデータベースに追加しますが、50の異なるxmlファイルがあります。
- xml URL がオフラインの場合は、xml の取得と DB の追加全体をスキップして、モデル バインディングのみを実行する必要があります。
これは私のアクション結果です:
public ActionResult Index()
{
//Get data from xml url (This is the code that shuld not run everytime a user visits the view)
var url = "http://www.interneturl.com/file.xml";
XNamespace dcM = "http://search.yahoo.com/mrss/";
var xdoc = XDocument.Load(url);
var items = xdoc.Descendants("item")
.Select(item => new
{
Title = item.Element("title").Value,
Description = item.Element("description").Value,
Link = item.Element("link").Value,
PubDate = item.Element("pubDate").Value,
MyImage = (string)item.Elements(dcM + "thumbnail")
.Where(i => i.Attribute("width").Value == "144" && i.Attribute("height").Value == "81")
.Select(i => i.Attribute("url").Value)
.SingleOrDefault()
})
.ToList();
//Fill my db entities with the xml data(This is the code that shuld not run everytime a user visits the view)
foreach (var item in items)
{
var date = DateTime.Parse(item.PubDate);
if (!item.Title.Contains(":") && !(date <= DateTime.Now.AddDays(-1)))
{
News NewsItem = new News();
Category Category = new Category();
var CategoryID = 2;
var WorldCategoryID = re.GetByCategoryID(CategoryID);
NewsItem.Category = WorldCategoryID;
NewsItem.Description = item.Description;
NewsItem.Title = item.Title.Replace("'", "");
NewsItem.Image = item.MyImage;
NewsItem.Link = item.Link;
NewsItem.Date = DateTime.Parse(item.PubDate);
re.AddNews(NewsItem);
re.save();
}
}
//All code below this commenting needs to run everytime a user visits the view
var GetAllItems = re.GetAllWorldNewsByID();
foreach (var newsitemz in GetAllItems)
{
if (newsitemz.Date <= DateTime.Now.AddDays(-1))
{
re.DeleteNews(newsitemz);
re.save();
}
}
var model = new ItemViewModel()
{
NewsList = new List<NewsViewModel>()
};
foreach (var NewsItems in GetAllItems)
{
FillProductToModel(model, NewsItems);
}
return View(model);
}
現在、ユーザーがインデックス ビューにアクセスするたびに、XML データが取得されて DB に追加されるため、私のリポジトリで行った悪い修正は addNews に続きます。
public void AddNews(News news)
{
var exists = db.News.Any(x => x.Title == news.Title);
if (exists == false)
{
db.News.AddObject(news);
}
else
{
db.News.DeleteObject(news);
}
}
どんな種類の解決策と情報も大歓迎です!