Как я могу узнать на стороне клиента, когда обработчик HTTP завершил обработку? - PullRequest
1 голос
/ 30 сентября 2008

Возможно, длинный вопрос для простого решения, но здесь идет ...

У меня есть пользовательский элемент управления silverlight для выбора нескольких файлов и отправки их на сервер. Он отправляет файлы в общий обработчик (FileReciever.ashx), используя метод OpenWriteAsync элемента управления WebCLient.

Обычно код silverlight делает что-то подобное для каждого файла:

WebClient client = new WebClient();
client.OpenWriteCompleted += (sender, e) =>
  {
    PushData(data, e.Result);
    e.Result.Close();
    data.Close();
  };
client.OpenWriteAsync(handlerUri); 

Обработчик на стороне сервера просто читает входящий поток, а затем выполняет дополнительную обработку результирующего байтового массива.

ПРОБЛЕМА заключается в том, что на стороне клиента OpenWriteCompleted выполняется, как только все данные отправлены по проводам. Мой код будет ограничен следующим файлом. Что я действительно хочу, так это дождаться, пока обработчик ASHX завершит всю обработку этого запроса. Как я могу это сделать? Любой механизм ожидания на WebClient? Любой обратный вызов, который я могу сделать на HttpContext в обработчике? Должен ли я использовать какой-то другой метод передачи? Пожалуйста, совет!

Ответы [ 5 ]

1 голос
/ 30 ноября 2011

Тот же вопрос был задан в Silverlight форумах . Microsoft одобрила ответ, что вы не можете сделать это с помощью WebClient и OpenWriteAsync. Вам нужно либо загрузить UploadStringAsync, либо запрос HttpWebRequest.

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

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

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

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

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

Я бы хотел, чтобы ваш обработчик имел только какой-то идентификатор (например, GUID или int), который можно использовать для получения результата обработчика в другом запросе. Таким образом, страница будет вызывать обработчик, обработчик будет сохранять результат и возвращать идентификатор, страница будет вызывать обработчик во второй раз и вызывать другой обработчик для получения результата первого вызова. Это сохранит ваш сервер в работе во время передачи ваших данных.

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

Или вы можете сделать это с помощью JavaScript (jQuery) ... если вы не возражаете против использования JavaScript, который есть.

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

Хм, может быть простым решением было бы пометить URL идентификатором GUID (guid уникален для каждого файла или передать, что бы ни имело смысла в вашей ситуации). Затем у вас может быть другой простой веб-сервис, способный проверять состояние другого сервиса на основе руководства, и ваш клиент Silverlight запрашивает этот новый сервис для своего статуса обработки (передавая новый веб-сервис руководство Прошлый перевод).

...