我的azure blob永远不会返回,但也没有错误

时间:2015-06-21 19:29:35

标签: objective-c azure-storage azure-mobile-services azure-storage-blobs

我有一个使用azure存储blob for jpg照片的IOS应用程序。我的问题是检索blob以供显示。

大部分时间他们都被罚款。但偶尔会有一个奇怪的人不会被退回。而是返回749个字节,但错误仍然是= nil。

现在没关系,真的没问题。然而,在我尝试再次检索该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的回复和一篇博文BY 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(

1 个答案:

答案 0 :(得分:1)

我不确定您正在使用的网络库(您的请求对象),因此我假设它基于NSURLSession和NSURLRequest。如果没有,这里的细节将是错误的,但潜在的原因仍然可能是正确的。

我猜你的问题是双重的。

  • 对于NSURLSession downloadTaskWithRequest:completionHandler:,传递到完成处理程序块的NSError参数仅针对客户端错误设置。在客户端上没有检测到可重试的服务端错误(throtting,服务器忙等) - 您需要查看HTTP response code /消息并正确处理。

  • 查看NSURLSessionConfiguration文档,特别是requestCachePolicy。我的猜测是,当您尝试重新获取blob的内容时,您将从缓存中获取过时数据。您可以使用此参数强制请求从服务重新获取数据,如果这确实导致了问题。