Xamarin Android的Url图像获取请求接收403错误,但不在iOS上

问题描述:

我正在使用存储在S3存储桶中的图像的xamarin应用程序。使用构建正确的URL时,查询工作正常在xamarin:Xamarin Android的Url图像获取请求接收403错误,但不在iOS上

https:// + BucketName + path + ".jpg?AWSAccessKeyId=keycode&Expires=expireNumber&Signature=signatureCode" 

当使用 Image.Source = urlAddress(如上面的格式) 加载图像精细

的应用程序页面的部分与图片自定义渲染需要通过url地址呈现。我们通过每个os级别的url更新图像。 iOS正在使用以下代码正常工作:

using (var url = new NSUrl(uri)) 
using (var data = NSData.FromUrl(url)) 
     if (data != null) 
      return UIImage.LoadFromData(data); 

哪一个成功地从Url获​​取图像并更新它。但是,我有重大问题在Android上运行。我已经尝试了以下区域:

制作基本的android url并使用以下代码设置imageView。这已经说明,这里不再工作https://forums.xamarin.com/discussion/4323/image-from-url-in-imageview

Android.Net.Uri url = Android.Net.Uri.Parse(url); 

imageView.SetImageURI(URL);

在使用WebClient的同一链接上,用户'rmacias'建议通过url下载数据并将字节解析为android位图。

private Bitmap GetImageBitmapFromUrl(string url){ 

Bitmap imageBitmap = null;

using (var webClient = new WebClient()) 
{ 
     var imageBytes = webClient.DownloadData(url); 
     if (imageBytes != null && imageBytes.Length > 0) 
     { 
      imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length); 
     } 
} 

return imageBitmap;} 

这将返回一个403 Forbidden错误。在线var imageBytes = webClient.DownloadData(url) 但是,同样的过程在iOS中工作,该字符串已经过身份验证,并且我已将身份验证超时设置为在缓慢加载数分钟之前。我也对.Net.Http库提出了相同的URL请求方法。 它崩溃在res = (HttpWebResponse)request.GetResponse();与403禁止错误。

我已经为WebClient和Http客户端尝试了多种头标认证方式。它感觉它的特定于android请求url数据的东西,因为url字符串中的认证适用于Xamarin图像和ioS代码。

我在想我有什么特定于android的东西,我失踪了?非常感谢帮助!

如何使用HttpClient,它可以利用Xamarin提供的平台特定的HttpClientHandler?

因此,像:

// make sure to reuse your HttpClient instance, it is a shared resource 
// using it in a using() and disposing it all the time, will leave 
// sockets open and bog down the connection! 
private static HttpClient _httpClient; 

public async Task<byte[]> GetImageDataAsync(string url) 
{ 
    if (_httpClient == null) 
    { 
     // you could inject AndroidHttpClientHandler or NSUrlSessionHandler here... 
     _httpClient = new HttpClient(); 
     // set headers etc... 
    } 

    var response = await _httpClient.GetAsync(url).ConfigureAwait(false); 
    if (!response.IsSuccessStatusCode) 
     return null; 

    var result = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); 
    return result; 
} 

然后你就可以利用这个平台不可知,如:

var data = await GetImageDataAsync(url); 
imageBitmap = BitmapFactory.DecodeByteArray(data, 0, data.Length); 

在iOS

var data = await GetImageDataAsync(url); 
var imageData = NSData.FromArray(data); 
imageBitmap = UIImage.LoadFromData(imageData); 

也有不错的库,如FFImageLoading,它支持这个开箱即用的效果,可以在TableViews中加载图像等等ñ考虑作为替代。

+0

太棒了,谢谢!似乎与我的预先认证的url字符串正常工作(因此没有标题等需要)。 –