Извлечение и кэширование HTML с веб-сайта с использованием ASP.NET MVC 3
Я хочу частичное представление, которое отображает некоторые вещи с веб-сайта, который не находится под моим контролем. Данные на сайте доступны только через HTML, и поэтому я могу получить их только путем запроса веб-сайта и анализа HTML. (На веб-сайте содержится список из 50 элементов, и мне нужны только первые 10.) Теперь данные с веб-сайта меняются не очень часто, поэтому я представляю, что могу почасово извлекать HTML и отображать кэшированный версия на моем сайте.
Как я могу сделать это в ASP.NET MVC 3?
3 ответа
Первое решение, которое приходит на ум, - это создать действие в контроллере, который отправляет запрос Http на удаленную веб-страницу и анализирует HTML-код, который вы хотите вернуть на свою страницу, а затем настраивает кэширование вывода для вашего действия.
Редактировать:
Какой контроллер будет использовать действие, зависит от структуры вашего веб-сайта и от того, будет ли частичное представление отображаться во всех представлениях или только в определенном представлении. Если частичное видимо во всех видах, я бы либо поместил его в контроллер Home, либо создал бы "общий" контроллер (если бы я ожидал, что в таком контроллере будет больше действий).
Если вы хотите манипулировать результатом, я бы сделал модель и частичное представление списка. Если вы хотите взять часть возвращенного html и вывести ее как есть, я бы использовал тот же метод, что и в ответе Мэтью Эбботта:
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);
}
(Часть приведенного выше кода была заимствована из поста Мэтью Эбботтом.)
Игнорируя требование 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);
}
Вы можете просто добавить атрибут OutputCache к своему действию и установить для свойства OutputCache.Duration значение 3600 секунд (1 час).