Как вы измеряете прогресс вызова веб-службы? - PullRequest
6 голосов
/ 25 сентября 2008

У меня есть веб-сервис ASP.NET, который выполняет тяжелую работу, например, над некоторыми файловыми операциями, или генерирует листы Excel из нескольких отчетов Crystal Reports. Я не хочу, чтобы меня блокировали, вызывая этот веб-сервис, поэтому я хочу сделать вызов веб-сервиса асинхронным. Кроме того, я хочу вызвать этот веб-сервис с веб-страницы и хочу какой-то механизм, который позволит мне продолжать опрашивать сервер, чтобы я мог показать на экране какой-либо индикатор прогресса, например, количество файлов, которые были обработаны. Обратите внимание, что я не хочу получать уведомления о завершении вызова веб-метода, скорее, я хочу получить статус в реальном времени. Как мне это сделать?

Ответы [ 6 ]

4 голосов
/ 25 сентября 2008

Напишите отдельный метод на сервере, к которому вы можете запросить, передав идентификатор запланированного задания, который возвращает приблизительное значение в диапазоне 0-100 (или от 0,0 до 1,0, или что-то еще) от того, как далеко оно проходит. .

например. в стиле REST вы могли бы сделать запрос GET на http://yourserver.com/app/jobstatus/4133/, который бы возвратил простое '52' как text/plain. Тогда вам просто нужно запросить это каждые (секунды? Две секунды? Десять секунд?), Чтобы увидеть, как далеко это продвинуто.

То, как вы на самом деле выполняете мониторинг на бэкэнде, во многом зависит от того, что представляет собой ваш процесс и как он работает.

2 голосов
/ 25 сентября 2008

Вы также можете использовать SoapExtensions , чтобы уведомить своего клиента о ходе загрузки / процесса. Затем сервер может отправлять события клиенту. Ничто в клиенте не должно быть изменено, если вы не используете его.

Позволяет что-то подобное в вашем клиенте:

//...
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService ();
_myWebService.processDelegate += ProgressUpdate;
_myWebService.CallHeavyMethod();
//...

private void ProgressUpdate(object sender, ProgressEventArgs e)
{
  double progress = ((double)e.ProcessedSize / (double)e.TotalSize) * 100.00;
  //Show Progress...
}
2 голосов
/ 25 сентября 2008

Я думаю, что веб-служба XML работает медленно, поэтому при создании нескольких методов и опроса прогресс будет чрезвычайно медленным и вызовет огромную нагрузку на сервер. Я бы не стал делать это в производственной среде. Я вижу те же (но меньшие) проблемы с опросом базы данных.

Попробуйте вместо SOAP-расширений . Он реализует управляемую событиями модель. См. Добавление индикатора выполнения в клиентское приложение веб-службы на MSDN .

.
1 голос
/ 25 сентября 2008

Проще всего было бы, чтобы веб-служба обновила поле в базе данных по мере выполнения вызова, а затем создала веб-службу, которая запрашивает это поле и возвращает значение.

1 голос
/ 25 сентября 2008

Пусть начальный вызов веб-службы «генерация отчета» создаст задачу в некотором пуле задач и вернет вызывающей стороне идентификатор задачи.

Затем предоставьте другой метод, который возвращает «процент выполнения» для заданного идентификатора задачи.

Укажите третий метод, который возвращает фактический результат для выполненной задачи.

0 голосов
/ 25 сентября 2008

Сделайте веб-сервис для возврата какого-либо идентификатора задачи или идентификатора сеанса. Сделайте другой веб-метод для запроса с этим идентификатором, который возвращает необходимую информацию (% завершение, список файлов, что угодно). Опросить этот метод на некотором интервале от клиента.

Используйте базу данных для хранения информации о процессе, если вы делаете это в памяти веб-службы, это не будет хорошо масштабироваться в среде веб-фермы, поскольку может случиться, что задача выполняется на другом сервере, чем тот, на котором вы находитесь опрос.

РЕДАКТИРОВАТЬ: Я только что видел другой аналогичный ответ, и комментарий к нему. Комментатор прав - вы можете использовать таблицу в памяти, чтобы избежать операций с диском, но все же использовать отдельный сервер БД.

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