Сведения о вопросе

FUTER

21:42, 10th August, 2020

Теги

.net   silverlight    

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

Просмотров: 507   Ответов: 4

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

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

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

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

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

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



  Сведения об ответе

JUST___

17:27, 5th August, 2020

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


  Сведения об ответе

KOMP

04:55, 25th August, 2020

У Мэтта Берсета были кое-какие мысли на этот счет, может быть, помогут:

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

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


  Сведения об ответе

PHPH

17:57, 19th August, 2020

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

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


  Сведения об ответе

#hash

15:16, 4th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться