Процесс Ajax-сервера с текущим состоянием интерфейса? - PullRequest
0 голосов
/ 25 октября 2010

У меня есть процесс, который извлекает html с удаленного сайта и анализирует его. Я передаю несколько URL-адресов в метод, поэтому я хотел бы отрегулировать процесс и давать экранное уведомление каждый раз, когда URL-адрес завершает анализ. Например, вот что я пытаюсь сделать:

List<string> urls = ...//load up with arbitary # of urls

foreach (var url in urls)
{
    string html = GetContent(url);
    //DO SOMETHING
    //COMPLETED.. SEND NOTIFICATION TO SCREEN (HOW DO I DO THIS)
}

public static string GetContent(string url)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";

    using (var stream = request.GetResponse().GetResponseStream())
    {
        using (var reader = new StreamReader(stream, Encoding.UTF8))
        {
            return reader.ReadToEnd();
        }
    }
}

На каждой итерации в цикле я хочу показать, что URL был завершен и перейти к следующему. Как мне это сделать?

1 Ответ

1 голос
/ 25 октября 2010

Первое, о чем вам нужно беспокоиться, это тот факт (я предполагаю), что вы выполняете потенциально длительную операцию в коде ASP.NET.Это станет проблемой, когда вы будете использовать тайм-ауты IIS.(По умолчанию 90 секунд.) Предположим, вы обрабатываете десять URL-адресов, каждый из которых занимает 15 секунд, чтобы завершить reader.ReadToEnd() - ваш код истечет время и будет убит после шестого URL-адреса.

думать «я могу просто увеличить время ожидания», но это не очень хороший ответ;вы все еще испытываете нехватку времени.

Способ решения подобных проблем состоит в том, чтобы переместить длительные операции в автономную службу Windows, а затем использовать WCF для обмена данными между кодом ASP.NET и службой.Служба может запускать пул потоков, который выполняет запросы для обработки группы URL-адресов.( Вот реализация , которая позволяет ставить рабочие элементы в очередь.)

Теперь со своей веб-страницы вы можете запрашивать обновления статуса с помощью запросов AJAX.Обработчик в вашем коде ASP.NET может использовать WCF для извлечения информации о состоянии из процесса Service.

Для этого можно назначить каждому представленному рабочему блоку уникальный идентификатор и вернуть этот идентификатор клиенту.,Затем клиент может опросить статус, отправив запрос AJAX о состоянии рабочего блока n.В Службе сохраняйте List рабочих единиц с их статусами (lock в зависимости от ситуации, чтобы избежать проблем параллелизма).

public class WorkUnit {
   public int ID { get; set; }
   public List<string> URLs { get; set; }
   public int Processed { get; set; }
}

private var workUnits = new List<WorkUnit>();

private void ExecuteWorkUnit(int id) {
    var unit = GetWorkUnit(id);

    foreach (var url in unit.URLs) {
         string html = GetContent(url);
         // do whatever else...
         lock (workUnits) unit.Processed++;
    }
}

public WorkUnit GetWorkUnit(int id) {
    lock (workUnits) {
         // Left as an exercise for the reader
    }
}

Вы будетеМне нужно заполнить методы для добавления рабочего модуля, возврата статуса данного рабочего модуля и работы с пулом потоков.

Я использовал подобную архитектуру с большим успехом.

...