2016-12-15 2 views
2

Я использую интернет-магазин для изображений пользователей, загруженных с помощью нашего приложения, защищенного SSL. Загрузка очень хорошо работает, так как я использую WebClient с прикрепленным сертификатом. Но когда я пытаюсь использовать компонент Xamarin.Forms.Image, например. с исходным кодом «https://blabla.com/upload/image123.jpg» изображение не может быть загружено на Android. В iOS это работает, поскольку у меня есть настраиваемый NSUrlProtocol, который обрабатывает SSL-соединение.Xamarin.Forms Image.Source с SSL

var image = new Image(); 

//will use ImageLoaderSourceHandler 
image.Source = "https://blabla.com/upload/image123.jpg"; 

В случае WebClient я придаю X509Certificate2 (закрытый ключ и пароль) HttpWebRequest.ClientCertificates и она работает. Но я потерял то, как я могу предоставить этот сертификат любому механизму загрузки за ImageLoaderSourceHandler.

Как я могу сделать эту работу на Android?

+0

Как вы добавляете источник? Вы можете поделиться этим кодом? –

+0

Как насчет 'image.Source = ImageSource.FromUri (' https://blabla.com/upload/image123.jpg ")' –

+0

Если предоставить строку, то ImageSourceConverter предоставит именно это. То, что я не получаю, - это то, как я могу загрузить ImageLoaderSourceHandler с SSL-защищенного Url. – Florian

ответ

2

Так что я в конечном итоге создание моего собственного SecuredUriImageSource:

var image = new Image(); 

//will use SecuredImageLoaderSourceHandler 
image.Source = new SecuredUriImageSource ("https://blabla.com/upload/image123.jpg"); 

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

[assembly: ExportImageSourceHandler(typeof(SecuredUriImageSource), typeof(SecuredImageLoaderSourceHandler))] 
namespace Helpers 
{ 
    public class SecuredUriImageSource : ImageSource 
    { 
     public readonly UriImageSource UriImageSource = new UriImageSource(); 

     public static SecuredUriImageSource FromSecureUri(Uri uri) 
     { 
      var source = new SecuredUriImageSource(); 

      source.UriImageSource.Uri = uri; 

      return source; 
     } 
    } 

    public class SecuredImageLoaderSourceHandler : IImageSourceHandler 
    { 
     public async Task<Bitmap> LoadImageAsync(ImageSource imagesource, Android.Content.Context context, CancellationToken cancelationToken = default(CancellationToken)) 
     { 
      var imageLoader = imagesource as SecuredUriImageSource; 

      if (imageLoader != null && imageLoader.UriImageSource.Uri != null) 
      { 
       var webClient = new WebExtensions.WebClientEx(); 
       var data = await webClient.DownloadDataTaskAsync(imageLoader.UriImageSource.Uri, cancelationToken).ConfigureAwait(false); 
       using (var stream = new MemoryStream(data)) 
        return await BitmapFactory.DecodeStreamAsync(stream).ConfigureAwait(false); 
      } 

      return null; 
     } 
    } 
} 
+0

Привет @Florian Не могли бы вы дать мне ** SecuredUriImageSource ** содержание класса? а также совместно использовать обработчик iOS **. –

+0

Это на самом деле довольно просто - я обновил ответ. – Florian

+0

Спасибо! Это хорошо работает ... –

Смежные вопросы