Исключение. Префикс URI не распознается WebClient.DownloadDataAsync.

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

Полное исключение:

[ERROR] FATAL UNHANDLED EXCEPTION: System.Reflection.TargetInvocationException: 
An exception occurred during the operation, making the result invalid. 
Check InnerException for exception details. ---> 
    System.Net.WebException: An exception occurred during a WebClient request. --->
         System.NotSupportedException: The URI prefix is not recognized.

Некоторый код:

imagen_tap.Tapped += async (s, e) =>
{
   Console.WriteLine("URL IMAGE BRO::::::::: " + imagen.Source.ToString());
   await api.DownloadImage(new Uri(imagen.Source.ToString()));
   string path = Preferences.Get("filePath", "");
   await Launcher.OpenAsync(new OpenFileRequest { File = new ReadOnlyFile(path) });
};


public async Task DownloadImage(Uri URL)
        {
            WebClient webClient = new WebClient();

            string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Images", "temp");
            string fileName = URL.ToString().Split('/').Last();
            string filePath = Path.Combine(folderPath, fileName);

            webClient.DownloadDataCompleted += (s, e) =>
            {
                Directory.CreateDirectory(folderPath);

                File.WriteAllBytes(filePath, e.Result); //Broken?
            };

            webClient.DownloadDataAsync(URL);

            Preferences.Set("filePath", filePath);
        }

РЕДАКТИРОВАТЬ: (забыл добавить это) (НЕ НАСТОЯЩИЙ URL-адрес). api.com/imagenes/partes/18005/2021062311191329243400.jpg

РЕДАКТИРОВАТЬ: (отвечая Джейсону, проверяя правильность URL-адреса на веб-клиенте)

URI скриншота в веб-клиенте

Снимок экрана: открытие локального хранилища

Скриншот с пунктирной линией

Снимок экрана e в отладке

РЕДАКТИРОВАТЬ:

Ну... я исправил префикс Uri...

Я изменил 2 вещи: в загружаемом изображении я изменил его с Task на строку и вернул строку. Код:

public string DownloadImageString(string URL)
        {
            WebClient webClient = new WebClient();

            string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Images", "temp");
            string fileName = URL.ToString().Split('/').Last();
            string filePath = Path.Combine(folderPath, fileName);

            webClient.DownloadDataCompleted += (s, e) =>
            {
                Directory.CreateDirectory(folderPath);

                File.WriteAllBytes(filePath, e.Result);
            };

            webClient.DownloadDataAsync(new Uri(URL));

            return filePath;
        }

А потом я изменил способ отправки URL.

Вместо отправки нового Uri(url) я отправляю строку. Эта строка снова монтируется вручную, а не с помощью imagen.Source (это было настоящим исправлением). Код:

Image imagen = new Image
                {
                    Source = url + Foto.ID_Parte + "/" + Foto.Archivo
                };
                var imagen_tap = new TapGestureRecognizer();
                imagen_tap.Tapped += async (s, e) =>
                {
                    string path = api.DownloadImageString(url + Foto.ID_Parte + "/" + Foto.Archivo);
                    await Launcher.OpenAsync(new OpenFileRequest { File = new ReadOnlyFile(path) });
                };
                
                imagen.GestureRecognizers.Add(imagen_tap);

person Cristian Garcia Blasco    schedule 21.07.2021    source источник
comment
Если у вас есть вопросы, пожалуйста, задайте их в своем сообщении.   -  person blackapps    schedule 21.07.2021
comment
И скажите, какой префикс uri.   -  person blackapps    schedule 21.07.2021
comment
Префикс URI не распознан. кажется довольно ясным сообщением. Какой URI вы пытаетесь скачать?   -  person Jason    schedule 21.07.2021
comment
Отредактированный вопрос, я действительно забыл опубликовать URL   -  person Cristian Garcia Blasco    schedule 21.07.2021
comment
вы уверены, что это действительно URL-адрес, передаваемый веб-клиенту? Судя по вашему коду, вы пытаетесь извлечь URL-адрес из ImageSource, что не сработает.   -  person Jason    schedule 21.07.2021
comment
Отредактированный вопрос с отладкой.   -  person Cristian Garcia Blasco    schedule 21.07.2021
comment
какая конкретная строка вызывает исключение?   -  person Jason    schedule 21.07.2021
comment
Тот, что с //Broken? Отредактированный вопрос, добавление скриншота   -  person Cristian Garcia Blasco    schedule 21.07.2021
comment
Тогда кажется, что проблема не в URL-адресе, который вы пытались загрузить. Учитывая, что код добрался до DownloadDataCompleted . Очевидный следующий вопрос: значение filePath непосредственно перед `File.WriteAllBytes? И в чем ценность e.Result?   -  person ToolmakerSteve    schedule 21.07.2021
comment
Добавил скриншот, е дает проблемы.   -  person Cristian Garcia Blasco    schedule 21.07.2021
comment
Ах, тогда моя ошибка. Я ошибочно полагал, что когда DownloadDataCompleted был достигнут, мы миновали возможность проблемы в WebRequest. Мне не приходило в голову, что если бы был сбой, он был бы в Результате. Очень странно, что вы получили ошибку префикса в том, что выглядит как обычный префикс (https://)...   -  person ToolmakerSteve    schedule 21.07.2021
comment
Кстати, вам понадобится await перед строкой webClient.DownloadDataAsync(URL);. Не решит эту проблему, но позволит избежать блокировки потока во время загрузки.   -  person ToolmakerSteve    schedule 21.07.2021
comment
Я пробовал, но не выдает ошибку, нельзя использовать с Void. prnt.sc/1dzcxey Я мог бы выполнить await Task.Run(() =› webClient.DownloadDataAsync(URL)) ;   -  person Cristian Garcia Blasco    schedule 21.07.2021
comment
Я не могу придумать никакой причины, кроме чего-то странного в этой строке URI. Я рекомендую тестировать жестко заданную строку URL, которая, как известно, действительна. Например. одно из изображений, которые вы только что разместили, например Uri = new Uri("https://i.stack.imgur.com/oXhTP.png". То же сообщение об ошибке?   -  person ToolmakerSteve    schedule 21.07.2021
comment
Странно... с HardCoded Uri я получаю System.IO.FileNotFoundException: «Не удалось найти файл /data/user/0/com.companyname.workersapp/files/Images/temp/oXhTP.png». Но с настоящим Uri я получаю другая ошибка...   -  person Cristian Garcia Blasco    schedule 21.07.2021
comment
Попробуйте использовать byte[] bytes_image = webClient.DownloadData(URL); напрямую, чтобы увидеть, возвращает ли он данные, см. образец здесь: stackoverflow.com/a/60090843/8187800.   -  person ColeX - MSFT    schedule 22.07.2021
comment
Он взрывается, говоря: System.NotSupportedException: «WebClient не поддерживает одновременные операции ввода-вывода».   -  person Cristian Garcia Blasco    schedule 23.07.2021


Ответы (2)


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

эта библиотека быстро и легко загружает изображения в Xamarin.iOS, Xamarin.Android, Xamarin.Forms

подтвердите меня, если этот ответ работает для вас или нет!

person saqib kafeel    schedule 21.07.2021
comment
Дело в том, что этот пост является Попыткой решить другой пост xD Я хочу открыть изображение в приложении галереи по умолчанию на Android/IOS И кто-то сказал мне использовать функцию. Но эта функция работает только с локальными изображениями, поэтому я подумал: загрузите изображение и откройте его... Сообщение: stackoverflow.com/questions/68437194< /а> - person Cristian Garcia Blasco; 21.07.2021

Итак, фикс работает, сейчас тестил в телефоне и работает корректно, фикс в последней правке.

person Cristian Garcia Blasco    schedule 27.07.2021