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中加载图像等等ñ考虑作为替代。
太棒了,谢谢!似乎与我的预先认证的url字符串正常工作(因此没有标题等需要)。 –