Загрузка двоичных данных с помощью Silverlight 2b2

Я пытаюсь загрузить файл или поток данных на наш веб-сервер и не могу найти достойный способ сделать это. Я пробовал и WebClient, и WebRequest, у обоих есть свои проблемы.

WebClient
Красиво и просто, но вы не получаете никаких уведомлений о завершении асинхронной загрузки и о том, что событие UploadProgressChanged не вызывается с какой-либо полезной информацией. Альтернативой является преобразование ваших двоичных данных в строку и использование UploadStringASync, потому что тогда, по крайней мере, вы получите UploadStringCompleted, проблема в том, что вам нужно много оперативной памяти для больших файлов, поскольку он кодирует все данные и загружает их за один раз.

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

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

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

Надеюсь на помощь с этим.


person Dan    schedule 15.08.2008    source источник


Ответы (4)


Я могу обойти это через 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 из-за двойных и тройных асинхронных вызовов.

person Brian Leahy    schedule 15.08.2008

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

Мне нужно использовать Silverlight, поскольку мне нужно / хочу загрузить несколько файлов, а HTML не позволяет загружать несколько файлов.

person Dan    schedule 15.08.2008


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

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

Спасибо за совет.

person Dan    schedule 15.08.2008