试图从运行在云服务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)。
我将一行一行地构建一个没有包的应用程序,只是为了测试连接,然后在中添加包。
以前有人看到过这样的情况吗?当时绝对确定所有的cred和标识符字符串都是正确的小写?
哇,我真傻。
问题是:我有两个设置:
<?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点部署软件。曾经