我正在使用在线商店获取通过SSL保护的应用程序上传的用户图像。上传工作正常,因为我使用附带证书的WebClient。但是,当我尝试使用Xamarin.Forms.Image组件时,例如如果将来源设置为“https://blabla.com/upload/image123.jpg”,则无法在Android上加载图片。在iOS上,这是有效的,因为我有一个处理SSL连接的自定义NSUrlProtocol。
var image = new Image();
//will use ImageLoaderSourceHandler
image.Source = "https://blabla.com/upload/image123.jpg";
对于WebClient,我将X509Certificate2(私钥和密码)附加到HttpWebRequest.ClientCertificates,它可以正常工作。但是我失去了如何将该证书提供给ImageLoaderSourceHandler背后的任何加载机制。
如何在Android上运行此功能?
答案 0 :(得分:3)
所以我最终建立了自己的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;
}
}
}
答案 1 :(得分:1)
我按照https://blog.xamarin.com/securing-web-requests-with-tls-1-2/中的设置操作,HTTPS源才开始加载。
编辑:
您可以打开&#34; Android项目&#34;的属性页面。 - &GT; &#34; Android选项&#34; - &GT; &#34;高级&#34;并选择HttpClient Implementation作为托管代码,并使用Native TLS 1.2+作为下一个选项
答案 2 :(得分:0)
我必须更新所有Xamarin.Android程序包才能正常工作