【问题标题】:Azure blob storage throws StorageClientException: "One of the request inputs is out of range"Azure Blob 存储引发 StorageClientException:“其中一个请求输入超出范围”
【发布时间】:2012-08-02 19:48:47
【问题描述】:

尝试从运行在云服务 Web 角色中的 Azure 存储帐户读取会抛出

[StorageClientException: One of the request inputs is out of range.]
Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result() +96
Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait() +271
Microsoft.WindowsAzure.StorageClient.CloudBlobContainer.SetPermissions(BlobContainerPermissions permissions, BlobRequestOptions options) +229

我在该主题上找到的所有文章都表明问题出在存储连接字符串或 blob 容器名称中的大写字母。

代码如下:

var cloudStorageAccount = CloudStorageAccount.FromConfigurationSetting(StorageConnectionStringConfigKey);
var blobClient = cloudStorageAccount.CreateCloudBlobClient();
var blobContainerName = "containername";
var blobContainer = blobClient.GetContainerReference(blobContainerName.ToLower(CultureInfo.InvariantCulture));
var permissions = new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Container };
blobContainer.SetPermissions(permissions);
var blobName = "SomeXmlFile.xml";
var blob = blobContainer.GetBlobReference(blobName);
var text = blob.DownloadText();

在 blobContainer.SetPermissions 处引发异常。

当使用相同的代码和相同的凭据从计算模拟器而不是实时 Web 角色访问相同的容器时,一切正常。从 Neudesic 的 Azure 存储资源管理器中读取 blob 容器也没有问题。

可能相关:我的本地环境只有 2012 年 6 月的 Azure SDK(版本 1.7)。另外,我最近将应用程序从 1.0.8 升级到 Postmark 1.0.14,以及它的依赖 Newtownsoft Json.NET(从 4.0 升级到 4.5.8)。

我将逐行构建一个应用程序,没有包,只是为了测试连接,然后添加包。

当他们绝对确定所有凭据和标识符字符串都是正确的小写时,有没有人见过这个?

【问题讨论】:

  • 如果你能发布一些代码会有所帮助
  • 还有其他情况会导致错误 - 例如,带有无效字符的分区键/行键,超出范围的日期。这些是表存储,而不是 blob。您可以尝试通过 RDP 在 VM 上使用 Fiddler 来捕获通过的 HTTP 请求。
  • 您确定容器(在实际的 blob 存储中)存在吗?在尝试设置权限之前先尝试container.CreateIfNotExists()
  • 一般建议是使用 Fiddler 来查看请求/响应,但是由于这仅在代码以您的角色运行时发生,要调试此问题,您可以做的一件事是捕获此异常,然后获取异常的“ExtendedErrorInformation”属性。这将告诉您有关错误的更多详细信息 (msdn.microsoft.com/en-US/library/…)。
  • 在本地运行(本地配置文件)和部署(云配置文件)时,您是否使用了不同的连接字符串?

标签: .net azure azure-blob-storage


【解决方案1】:

哇,我是不是傻了。

问题原来是这样的:我有两个设置:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="Cloud" ...>
  <WebRole name="WebRole" vmsize="Small">
    <ConfigurationSettings>
      <Setting name="MessagesConfigurationBlobName" />
      <Setting name="MessagesConfigurationBlobContainerName" />
    </ConfigurationSettings>
  </WebRole>
</ServiceDefinition>

这是本地(模拟器)配置文件:

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration ...>
  <Role name="WebRole">
    <ConfigurationSettings>
      <Setting name="MessagesConfigurationBlobName" value="LocalMessageConfig.xml"/>
      <Setting name="MessagesConfigurationBlobContainerName" value="containername"/>
    </ConfigurationSettings>
  </Role >
</ServiceConfiguration>

这是云文件:

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration ...>
  <Role name="WebRole">
    <ConfigurationSettings>
      <Setting name="MessagesConfigurationBlobName" value="containername" />
      <Setting name="MessagesConfigurationBlobContainerName" value="CloudMessageConfig.xml"/>
    </ConfigurationSettings>
  </Role >
</ServiceConfiguration>

我现在要大哭一场,将我的时间跟踪(周六凌晨 3 点)从“紧急客户工作”调整为“开发人员 PEBCAK”。

故事的寓意是,当相同的代码在一个环境中失败而在另一个环境中成功时,不要只比较环境,而是比较环境之间您自己的代码中可能不同的所有内容 .

哦,不要尝试在凌晨 3 点部署软件。永远。

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 2015-07-24
    • 2014-12-17
    • 2021-11-15
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2019-03-21
    相关资源
    最近更新 更多