我的 azure blob 从未返回,但也没有错误
My azure blob is never returned, but no error is either
我有一个 IOS 应用程序,它使用 azure 存储 blob 存储 jpg 照片。我的问题是在检索要显示的 blob 时。
大多数时候它们都可以正常检索。但是偶尔会有一个奇怪的不会被退回。相反,返回了 749 个字节,但错误仍然 = nil。
这样就好了,真的没问题。但是,之后每次我尝试再次检索该 blob 时,都会出现同样的问题。
所有周围的 blob 都返回正常。有问题的 blob 没问题,可以使用其他设备检索。
我花了很多时间来清除所有涉及的变量并重新调用有问题的 blob,但无论如何只返回 749 个字节。从设备中删除应用程序并重新安装是唯一的解决方法!
所以我假设 Azure 存储或移动服务认为返回的数据是正确的(因为它没有错误)并且一直发送相同的数据 - 我怎样才能防止这种情况并要求真正重试?
下面的实际检索代码由 github 提供:谢谢 Ajayi13,它几乎很棒
[request fetchDataWithBlock:^(NSData* data, NSError* error)
{
if(error)
{
if(block)
{
block(nil, error);
}
else if([(NSObject*)_delegate respondsToSelector:@selector(storageClient:didFailRequest:withError:)])
{
[_delegate storageClient:self didFailRequest:request withError:error];
}
return;
}
if(block)
{
block(data, nil);
}
else if([(NSObject*)_delegate respondsToSelector:@selector(storageClient:didGetBlobData:blob:)])
{
[_delegate storageClient:self didGetBlobData:data blob:blob];
}
}];
我现在根据 AdamSorrin 的回复和博客 post 添加了以下代码,作者:DANIEL PASCO:https://blackpixel.com/writing/2012/05/caching-and-nsurlconnection.html
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)[cachedResponse response];
// Look up the cache policy used in our request
if([connection currentRequest].cachePolicy == NSURLRequestUseProtocolCachePolicy) {
NSDictionary *headers = [httpResponse allHeaderFields];
NSString *cacheControl = [headers valueForKey:@"Cache-Control"];
NSString *expires = [headers valueForKey:@"Expires"];
if((cacheControl == nil) && (expires == nil)) {
NSLog(@"server does not provide expiration information and we are using NSURLRequestUseProtocolCachePolicy");
return nil; // don't cache this
}
}
return nil;
}
但这并没有解决我的问题:o(
我不确定您使用的是什么网络库(您的请求对象),所以我假设它基于 NSURLSession 和 NSURLRequest。如果不是,这里的细节将是错误的,但根本原因仍然可能是正确的。
我猜你的问题有两方面。
对于 NSURLSession downloadTaskWithRequest:completionHandler:, the NSError parameter passed into the completion handler block is set only for client-side errors. Retryable service-side errors (throtting, server busy, etc.) aren't detected as such on the client - you need to look at the HTTP response code/message 并适当处理。
查看 NSURLSessionConfiguration 文档,特别是 requestCachePolicy。我的猜测是,当您尝试重新获取 blob 的内容时,您正在从缓存中获取陈旧数据。您可以使用此参数强制请求从服务重新获取数据,如果这确实导致了问题。
我有一个 IOS 应用程序,它使用 azure 存储 blob 存储 jpg 照片。我的问题是在检索要显示的 blob 时。
大多数时候它们都可以正常检索。但是偶尔会有一个奇怪的不会被退回。相反,返回了 749 个字节,但错误仍然 = nil。
这样就好了,真的没问题。但是,之后每次我尝试再次检索该 blob 时,都会出现同样的问题。 所有周围的 blob 都返回正常。有问题的 blob 没问题,可以使用其他设备检索。
我花了很多时间来清除所有涉及的变量并重新调用有问题的 blob,但无论如何只返回 749 个字节。从设备中删除应用程序并重新安装是唯一的解决方法!
所以我假设 Azure 存储或移动服务认为返回的数据是正确的(因为它没有错误)并且一直发送相同的数据 - 我怎样才能防止这种情况并要求真正重试?
下面的实际检索代码由 github 提供:谢谢 Ajayi13,它几乎很棒
[request fetchDataWithBlock:^(NSData* data, NSError* error)
{
if(error)
{
if(block)
{
block(nil, error);
}
else if([(NSObject*)_delegate respondsToSelector:@selector(storageClient:didFailRequest:withError:)])
{
[_delegate storageClient:self didFailRequest:request withError:error];
}
return;
}
if(block)
{
block(data, nil);
}
else if([(NSObject*)_delegate respondsToSelector:@selector(storageClient:didGetBlobData:blob:)])
{
[_delegate storageClient:self didGetBlobData:data blob:blob];
}
}];
我现在根据 AdamSorrin 的回复和博客 post 添加了以下代码,作者:DANIEL PASCO:https://blackpixel.com/writing/2012/05/caching-and-nsurlconnection.html
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)[cachedResponse response];
// Look up the cache policy used in our request
if([connection currentRequest].cachePolicy == NSURLRequestUseProtocolCachePolicy) {
NSDictionary *headers = [httpResponse allHeaderFields];
NSString *cacheControl = [headers valueForKey:@"Cache-Control"];
NSString *expires = [headers valueForKey:@"Expires"];
if((cacheControl == nil) && (expires == nil)) {
NSLog(@"server does not provide expiration information and we are using NSURLRequestUseProtocolCachePolicy");
return nil; // don't cache this
}
}
return nil;
}
但这并没有解决我的问题:o(
我不确定您使用的是什么网络库(您的请求对象),所以我假设它基于 NSURLSession 和 NSURLRequest。如果不是,这里的细节将是错误的,但根本原因仍然可能是正确的。
我猜你的问题有两方面。
对于 NSURLSession downloadTaskWithRequest:completionHandler:, the NSError parameter passed into the completion handler block is set only for client-side errors. Retryable service-side errors (throtting, server busy, etc.) aren't detected as such on the client - you need to look at the HTTP response code/message 并适当处理。
查看 NSURLSessionConfiguration 文档,特别是 requestCachePolicy。我的猜测是,当您尝试重新获取 blob 的内容时,您正在从缓存中获取陈旧数据。您可以使用此参数强制请求从服务重新获取数据,如果这确实导致了问题。