Извлечение и кэширование 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 час).

Другие вопросы по тегам