Загрузить двоичные данные с Silverlight 2b2 - PullRequest
4 голосов
/ 15 августа 2008

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

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 16 августа 2008

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

0 голосов
/ 16 августа 2008

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

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

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

0 голосов
/ 15 августа 2008

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

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

0 голосов
/ 15 августа 2008

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

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

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

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