«Не удается получить доступ к disposedObject» в Xamarin при попытке отправить байт [] на сервер - PullRequest
0 голосов
/ 11 июня 2018

Старая версия этого вопроса стала слишком длинной, поэтому к концу многочисленных попыток решить эту проблему я пришел к выводу, что все можно свести к простому вопросу.Почему это приводит к SystemObjectDisposed.

    private async void PickPhotoButton_OnClicked(object sender, EventArgs e)
    {
            _globalStream = await DependencyService.Get<IPicturePicker> 
               ().GetImageStreamAsync();
            _globalArray = StreamToByteArray(_globalStream);

            var gal = new GalleryResource()
            {
                Pic = _globalArray
            };

            MemoryObjects.CurrentGallery = gal;
            var ctr = HelperMethods.GetInstance<GalleryController>();
            await ctr.Post();


     }

    public byte[] StreamToByteArray(Stream input)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            input.CopyTo(ms);
            return ms.ToArray();
        }
    }

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

В этот момент в хранилище выдается исключение:

var response =await _client.PostAsync (endPoint, _repService.ConvertObjectToStringContent (obj));

ConvertObjectToStringContent (obj) - не эта его часть.Отсюда он на самом деле возвращает значение, а байтовый массив виден внутри отладки, т.е.байтовый массив остается с действительной длиной до конца.

Единственное событие, которое имеет место, когда мы заканчиваем выбирать фотографию из библиотеки, это следующее:

        void OnImagePickerFinishedPickingMedia(object sender, 
           UIImagePickerMediaPickedEventArgs args)
        {
            UIImage image = args.EditedImage ?? args.OriginalImage;

            if (image != null)
            {
                // Convert UIImage to .NET Stream object
                NSData data = image.AsJPEG(1);
                Stream stream = data.AsStream();


                // Set the Stream as the completion of the Task
                taskCompletionSource.SetResult(stream);
            }
            else
            {
                taskCompletionSource.SetResult(null);
            }
            imagePicker.DismissModalViewController(true);
        }

Однако этопохоже, что он не располагает потоком, и даже если он это сделал, мы уже получили от него байтовый массив.


Попытка даже сделать это внутри собственного кода

 var client = new HttpClient();
                var c = new MultipartFormDataContent();
                c.Add(new StreamContent(image.AsJPEG(1).AsStream()));
                var response = await client.PostAsync(Settings.EndPoint + "api/gallery/", c);

Та же ошибка.

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

Итак, хотя эта проблема возникла в первую очередь с плагином CrossMedia https://github.com/jamesmontemagno/MediaPlugin, она совершила ту же ошибку.

Однако ошибка появляется только в том случае, если вы, например, выбрали фотографию, подобную этой:

var _mediaFile = await CrossMedia.Current.PickPhotoAsync();

Итак, когда я сделал это:

var _mediaFile = await CrossMedia.Current.PickPhotoAsync(new 
Plugin.Media.Abstractions.PickMediaOptions
        {
            PhotoSize = Plugin.Media.Abstractions.PhotoSize.Small,
            CompressionQuality = 90,
        });

Ошибка пошладалеко.Понятия не имею, почему.

0 голосов
/ 11 июня 2018

Я думаю, что ваша проблема лежит где-то в этой строке _byteArray = ToByteArray(_array);

ToByteArray(stream), кажется, возвращает вам байтовый массив, возможно, путем преобразования из потока, и этот поток все еще может иметь ссылку на байтовый массив.И это могло бы быть утилизировано.

Если это внутри этого метода, пожалуйста, опубликуйте его, я хочу знать:

Я не достаточно опытен, чтобы точно сказать, о чем он, но, возможно, мойпредложения будут попадать в нужное место!

Кстати, ваш код выглядит очень чисто, мне нравится!

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