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

StackOverflow https://stackoverflow.com/questions/12642

  •  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, но это явно не так.Во всем виноваты те два больших стакана чилийского красного, которые я только что выпил.:-)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top