我有一个我认为很重的 actionresult,所以我想知道如何优化它以获得更好的性能。此 Web 应用程序将同时被 +100, 000 个用户使用。
现在我的 Actionresult 做了以下事情:
- 从 Internet url 检索 XML 文件
- 将 xml 数据填充到我的数据库中
- 数据库数据填充我的 Viewmodel
- 将模型返回到视图
每次用户访问视图时都会触发这 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 数据并将其添加到数据库中,所以我在我的存储库中完成的错误修复如下 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);
}
}
任何类型的解决方案和信息都非常感谢!