【发布时间】:2011-08-17 12:18:42
【问题描述】:
我想要一个局部视图,显示来自不受我控制的网站的一些内容。 网站上的数据只能通过 HTML 获得,因此我只能通过查询网站和解析 HTML 来检索它。 (该网站包含 50 个元素的列表,我只想要前 10 个元素。) 现在,来自网站的数据变化不是很频繁,所以我想我可以每小时检索一次 HTML,并在我的网站上显示一个缓存版本。
如何在 ASP.NET MVC 3 中实现这一点?
【问题讨论】:
我想要一个局部视图,显示来自不受我控制的网站的一些内容。 网站上的数据只能通过 HTML 获得,因此我只能通过查询网站和解析 HTML 来检索它。 (该网站包含 50 个元素的列表,我只想要前 10 个元素。) 现在,来自网站的数据变化不是很频繁,所以我想我可以每小时检索一次 HTML,并在我的网站上显示一个缓存版本。
如何在 ASP.NET MVC 3 中实现这一点?
【问题讨论】:
想到的第一个解决方案是在控制器中创建一个操作,该操作向远程网页发出 Http 请求并解析您想要返回到您自己的页面的 html,然后在您的操作上设置输出缓存。
编辑:
将操作放入哪个控制器取决于您网站的结构以及部分视图是在所有视图上可见还是仅在特定视图上可见。如果部分在所有视图中都可见,我会将其放置在 Home 控制器中或创建一个“常规”控制器(如果我预计会有更多操作进入这样的控制器)。
如果您想操作结果,我可能会为列表创建一个模型和部分视图。如果您想获取返回的 html 的一部分并按原样输出,我将使用与 Matthew Abbott 的答案相同的方法:
return Content(yourHtmlString);
结尾看起来像这样:
[OutputCache(Duration = 3600)]
public ActionResult RemoteList()
{
var client = new WebClient();
var html = Encoding.UTF8.GetString(client.DownloadData("http://www.somedomain.com"));
// Do your manipulation here...
return Content(html);
}
(上面的部分代码是从 Matthew Abbott 的帖子中借来的。)
【讨论】:
您可以在您的操作中添加 OutputCache 属性并将 OutputCache.Duration Property 设置为 3600 秒(1 小时)
【讨论】:
暂时忽略 MVC3 要求,您应该考虑使用 WebClient 从网站获取 html。您可以执行以下操作:
var client = new WebClient();
var html = Encoding.UTF8.GetString(client.DownloadData("http://www.somedomain.com"));
如果您需要定制您的要求,我建议您查看HttpWebRequest、HttpWebResponse。既然可以抓取 html,还需要考虑缓存机制,可能在 ASP.NET 运行时中?
public ActionResult GetHtml()
{
if (HttpRuntime.Cache["html"] == null)
GetHtmlInternal();
return Content((string)HttpRuntime.Cache["html"], "text/html");
}
private void GetHtmlInternal()
{
var html = // get html here.
HttpRuntime.Cache.Insert("html", html, null, DateTime.Now.AddMinutes(60), Cache.NoSlidingExpiration);
}
【讨论】: