Извлечение и кэширование HTML с сайта с использованием ASP.NET MVC 3 - PullRequest
1 голос
/ 03 мая 2011

Я хочу частичное представление, которое отображает некоторые вещи с веб-сайта, который не находится под моим контролем.Данные на веб-сайте доступны только через HTML, и поэтому я могу получить их только путем запроса веб-сайта и анализа HTML.(Веб-сайт содержит список из 50 элементов, и мне нужны только первые 10.) Теперь данные с веб-сайта меняются не очень часто, поэтому я представляю, что могу почасово извлекать HTML и отображать кэшированныеверсия на моем веб-сайте.

Как это сделать в ASP.NET MVC 3?

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

Игнорируя требование 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);
}
3 голосов
/ 03 мая 2011

Первое решение, которое приходит на ум, - это создать действие в контроллере, который отправляет Http-запрос на удаленную веб-страницу и анализирует HTML-код, который вы хотите вернуть на свою страницу, а затем настраивает кэширование вывода для вашего действия.

Edit:

Какой контроллер будет использовать для действия, будет зависеть от структуры вашего веб-сайта и от того, будет ли частичное представление отображаться во всех представлениях или только в определенном представлении. Если частичное видимо во всех видах, я бы либо поместил его в контроллер 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);
}

(Часть вышеприведенного кода была заимствована из поста Мэтью Эбботтом.)

0 голосов
/ 03 мая 2011

Вы можете просто добавить атрибут OutputCache к своему действию и установить Свойство OutputCache.Duration на 3600 секунд (1 час)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...