【问题标题】:My azure blob is never returned, but no error is either我的天蓝色 blob 永远不会返回,但也没有错误
【发布时间】:2015-06-23 08:11:37
【问题描述】:

我有一个使用 azure 存储 blob 存储 jpg 照片的 IOS 应用程序。我的问题是在检索 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 的回复和 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(

【问题讨论】:

  • 能否链接到您正在使用的 GitHub 代码,或者将其包含在问题中?
  • 嗨 lindydonna,我正在使用的代码可以在 github.com/Ajayi13/BlobExample-Swift 找到。谢谢

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


【解决方案1】:

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

我猜你的问题有两个方面。

  • 对于 NSURLSession downloadTaskWithRequest:completionHandler:,传递到完成处理程序块的 NSError 参数仅针对客户端错误设置。在客户端上未检测到可重试的服务端错误(限制、服务器繁忙等) - 您需要查看 HTTP response code/message 并适当处理。

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

【讨论】:

  • 谢谢亚当..........我现在会阅读这些东西 - 但是是的,我在想某种缓存会不断被重复返回,所以这是有道理的。让我检查一下并尽快回复。
  • 谢谢。事实上,我以为我已经根据你的想法修复了一段时间……但没有令人失望的是……所以 - 我正在使用 NSURLConnection 并感谢一些博客文章,我添加了代码来捕获缓存策略并中断以防止项目被缓存。然而,一旦出现问题(当我得到 749 字节时),重新获取仍然会继续再次返回 749 字节。呸呸呸
  • PS:HTTP 响应代码显示“状态代码:200”,所以没有问题
  • 有趣,然后我什么都没有跳出来,对此感到抱歉。你能看看正在下载的实际数据吗?它是您期望的 blob 的子集(您可以从不同的设备下载吗?)其中是否有任何明显的文本? (例如,您的请求可能被解释为对“获取 blob 属性”或其他内容的调用,或者服务仅返回一个范围。)最后,您发布的禁用缓存的代码是否真的被命中了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 2019-11-15
  • 2011-07-25
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多