Загрузить двоичные данные с Silverlight 2b2

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

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

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

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

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

С нетерпением ждем помощи с этим.

15.08.2008 19:37:57
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 из-за двойных и тройных асинхронных вызовов.

1
15.08.2008 20:17:44

Мэтт Берсет имел некоторые мысли по этому поводу, может помочь:

http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html

@Dan - Извини, приятель, я мог бы поклясться, что статья Мэтта была о Silverlight, но это явно не так. Во всем виноваты те два больших стакана чилийского красного, которые я только что сбил. :-)

0
15.08.2008 20:07:54

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

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

0
15.08.2008 19:56:42

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

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

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

0
15.08.2008 23:01:08