Загрузка двоичных данных с помощью Silverlight 2b2
-
08-06-2019 - |
Вопрос
Я пытаюсь загрузить файл или поток данных на наш веб-сервер и не могу найти достойный способ сделать это.Я попробовал оба WebClient
и WebRequest
у обоих свои проблемы.
Веб-клиент
Красиво и просто, но вы не получите никакого уведомления о завершении асинхронной загрузки, а UploadProgressChanged
событие не вызывается с чем-либо полезным.Альтернативой является преобразование ваших двоичных данных в строку и использование UploadStringASync
потому что тогда, по крайней мере, ты получишь UploadStringCompleted
, Проблема в том, что для больших файлов вам нужно много оперативной памяти, поскольку они кодируют все данные и загружают их за один раз.
HttpWebRequest
Немного сложнее, но все равно делает то, что нужно. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя он вызывается в фоновом потоке (предположительно), он все равно блокирует мой пользовательский интерфейс и весь браузер до завершения загрузки, что кажется не совсем верно.
В обычном .net есть подходящие WebClient
методы для Онуплоаддатакомплетед и прогресс, но они недоступны в Silverlight .net...большое упущение, я считаю!
Есть ли у кого-нибудь решения, мне нужно загрузить несколько двоичных файлов, желательно с прогрессом, но мне нужно выполнить некоторые действия, когда файлы завершат загрузку.
Ждем помощи в этом.
Решение
Я могу обойти это через INotifyPropertyChanged и уведомление о событиях.
Основы:
public void DoIt(){
this.IsUploading = True;
WebRequest postRequest = WebRequest.Create(new Uri(ServiceURL));
postRequest.BeginGetRequestStream(new AsyncCallback(RequestOpened), postRequest);
}
private void RequestOpened(IAsyncResult result){
WebRequest req = result.AsyncState as WebRequest;
req.BeginGetResponse(new AsyncCallback(GetResponse), req);
}
private void GetResponse(IAsyncResult result)
{
WebRequest req = result.AsyncState as WebRequest;
string serverresult = string.Empty;
WebResponse postResponse = req.EndGetResponse(result);
StreamReader responseReader = new StreamReader(postResponse.GetResponseStream());
this.IsUploading= False;
}
private Bool_IsUploading;
public Bool IsUploading
{
get { return _IsUploading; }
private set
{
_IsUploading = value;
OnPropertyChanged("IsUploading");
}
}
На данный момент silverlight является PiTA из-за двойных и тройных асинхронных вызовов.
Другие советы
Спасибо, проблема, которую я вижу в статье, заключается в том, что речь не идет о Silverlight, а Silverlight имеет ограниченные функции, по какой-то причине они без причины удалили некоторые необходимые события и методы для двоичной передачи.
Мне нужно использовать Silverlight, так как мне нужно/хочу загрузить несколько файлов, а HTML не позволяет загружать несколько файлов.
У Мэтта Берсета были некоторые мысли по этому поводу, которые могут помочь:
http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html
@Дэн - Извиняюсь, приятель, я мог бы поклясться, что статья Мэтта была о Silverlight, но это явно не так.Во всем виноваты те два больших стакана чилийского красного, которые я только что выпил.:-)
Это было примерно то, что я делал, проблема, с которой я столкнулся, заключалась в том, что мой пользовательский интерфейс зависал.
Поскольку вы уже предположили, что я делал, я предположил, что проблема где-то в другом месте, поэтому я использовал старый метод «разделяй и властвуй», чтобы сузить проблему, и это был не сам код обновления, это была моя попытка Отправлять запрос на обновление моего индикатора выполнения во время кода потока загрузки.
Спасибо за совет.