2012-08-05 71 views
1

试图从内部云服务Web角色运行的Azure存储帐户读取抛出Azure的Blob存储抛出StorageClientException:“其中一个请求输入超出范围”

[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)。

我要建立由线的申请行,不包,只是为了测试连接,然后添加包英寸

有没有人,当他们见过这个绝对肯定所有信用和标识符字符串正确地小写?

+0

这将有助于如果你能发布一些代码 – 2012-08-05 16:49:26

+0

还有其他的方案,这将导致错误 - 例如,一个分区键/行键与无效字符,这是超出范围的日期。这些都是表格存储,但不是一团糟。您可以尝试通过RDP在VM上使用Fiddler来捕获跨越的HTTP请求。 – 2012-08-05 16:58:37

+0

你确定容器(在实际的blob存储中)存在吗?在尝试设置权限之前尝试'container.CreateIfNotExists()'? – smarx 2012-08-05 18:07:28

回答

3

哇,我是愚蠢的。

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

<?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点部署软件。永远。