调用CloudBlockBlob.CreateSnapshot()遇参数越界StorageException问题排查
解决Azure Blob存储CreateSnapshot()抛出ArgumentOutOfRangeException的问题
这个问题大概率是WindowsAzure.Storage SDK 8.7.0的已知Bug,而非你的代码实现错误,下面具体分析原因和解决方案:
问题原因分析
从你提供的异常栈可以看到,错误发生在NavigationHelper.ParseSnapshotTime方法中——这个方法负责把存储服务返回的快照时间字符串解析成DateTime对象。在8.7.0版本的SDK里,存在一个时间解析的逻辑缺陷:当存储服务返回的时间字符串包含超过3位的毫秒精度,或者时间格式和SDK预期的不完全匹配时,就会触发ArgumentOutOfRangeException。
你的代码逻辑本身没有问题:遍历容器内的Blob、跳过已有的快照、创建新快照并添加元数据的流程都是合理的,错误完全来自SDK内部的解析逻辑。
解决方案
1. 优先升级SDK版本(最彻底的解决办法)
微软在8.7.0之后的版本中修复了这个时间解析的Bug,建议你把WindowsAzure.Storage NuGet包升级到8.7.1及以上版本,或者直接升级到该SDK系列的最新稳定版(比如9.3.3)。升级后这个问题应该会直接消失。
2. 临时Workaround(如果无法立即升级)
如果暂时不能升级SDK,可以尝试修改调用CreateSnapshot的方式:直接在创建快照时传入元数据,而不是创建后再添加。这样可能绕过SDK内部的错误路径:
// 初始化元数据字典 var metadata = new Dictionary<string, string> { { "snapshotIssued", snapDate.ToString() } }; // 直接传入元数据创建快照,无需后续单独设置 var snapBlob = blob.CreateSnapshot(metadata);
不过这个方法只是临时的权宜之计,还是推荐优先升级SDK来彻底解决问题。
另外,你的代码中跳过快照Blob、捕获单个Blob异常的处理逻辑是合理的,这部分不需要调整。
内容的提问来源于stack exchange,提问作者ThatUser
相关产品推荐
相关产品推荐

