azure存储模拟器(表)返回400错误请求或403禁止

本文关键字:请求 错误 禁止 返回 模拟器 存储 azure | 更新日期: 2023-09-27 18:20:29

问题:访问azure开发表存储缺少什么?

注意:我可以访问我的azure CLOUD存储(当然使用不同的代码),但我在尝试访问开发存储时失败了。

我正在使用:

  • Visual Studio 2012
  • .Net Framework 4.0 C#库
  • NuGet Widows Azure Storage v6.0<==更正-使用v6.1.0.0
  • Microsoft Azure SDK for.net 2.6
  • Microsoft Azure Storage Emulator v4.0<-更改为v4.2修复问题

    var cloudStorageAccount = CloudStorageAccount.DevelopmentStorageAccount;
    var tableClient = cloudStorageAccount.CreateCloudTableClient();
    var table = tableClient.GetTableReference("MYTEMPTABLE");
    var iscreated = table.CreateIfNotExists();
    

    最后一条语句给出了这个异常

    The remote server returned an error: (400) Bad Request.
    The value for one of the HTTP headers is not in the correct format.
    RequestId:f0b37575-30f4-45c1-bec3-2620c3c605e7
    Time:2015-11-04T16:12:37.4719620Z
    

StackTrace

    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:'Program Files (x86)'Jenkins'workspace'release_dotnet_master'Lib'ClassLibraryCommon'Core'Executor'Executor.cs:line 816
    at Microsoft.WindowsAzure.Storage.Table.TableOperation.Execute(CloudTableClient client, CloudTable table, TableRequestOptions requestOptions, OperationContext operationContext) in c:'Program Files (x86)'Jenkins'workspace'release_dotnet_master'Lib'ClassLibraryCommon'Table'TableOperation.cs:line 41
    at Microsoft.WindowsAzure.Storage.Table.CloudTable.Exists(Boolean primaryOnly, TableRequestOptions requestOptions, OperationContext operationContext) in c:'Program Files (x86)'Jenkins'workspace'release_dotnet_master'Lib'ClassLibraryCommon'Table'CloudTable.cs:line 1605
    at Microsoft.WindowsAzure.Storage.Table.CloudTable.CreateIfNotExists(TableRequestOptions requestOptions, OperationContext operationContext) in c:'Program Files (x86)'Jenkins'workspace'release_dotnet_master'Lib'ClassLibraryCommon'Table'CloudTable.cs:line 1024
    at USPS.Cloud.Integration.AspProviders.UspsReturnsStorageBase.CreateStorageAccountFromConnectionString() in ... <my local code call stack>

仅供参考:在搜索MSDN、StackOverflow等时,我找到了3种方法来获取CloudStorageAccount对象以访问存储模拟器。前两个给出了上面的错误。第三个错误为403。


CloudStorageAccount = CloudStorageAccount.DevelopmentStorageAccount;

CloudStorageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true");

var devAccountName = "devstoreaccount1";
var devAccountKey = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==";
var devCredentials = new StorageCredentials(devAccountName, devAccountKey);
var cloudStorageAccount = new CloudStorageAccount(devCredentials, true);

更新

正如答案中所说,我没有正确的模拟器版本。开发人员存储连接1&2以上工作。根据@Emily Gerner-MSFT的回答中的链接,我找到了一个可行的选项3。

var devConnectionString = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;";
CloudStorageAccount = CloudStorageAccount.Parse(devConnectionString);

azure存储模拟器(表)返回400错误请求或403禁止

第三个不起作用,因为您没有设置模拟器端点,它正在发送到服务帐户devstoreaccount1,而不是本地模拟器。尝试使用TableEndpoint=http://127.0.0.1:10002/devstoreaccount1例如Azure模拟器文档在必要时提供了更多详细信息。

如果您在Emulator上看到README部分,您将看到最新的存储库版本需要最低模拟器版本4.2。这还应该提供一个下载链接。你会得到400个坏请求,因为你使用的库版本使用了旧模拟器无法知道的服务版本。

Looks AzureStorage NugetPackage>6.0.0与Azure SDK 2.8(Storage Emulator 4.8)配合使用

我也得到了400个错误。在我的情况下,我在启动Azure存储模拟器时遇到了问题。原因是其他进程正在侦听该端口。所以我在AzureStorageEmulator.exe中更改了端口号。您可以在C:''Program Files(x86)''Microsoft SDKs''Azure''Storage Emulator中找到此配置文件。或者安装模拟器的位置。之后模拟器启动。但这个400仍然没有消失。所以我在配置文件中使用了这个设置。"UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://ipv4.fiddler"〔Azure 2012年10月SDK破解UseDevelopmentStorage=true。看着fiddler,我意识到请求被定向到端口号10000。我找不到改变它的方法。所以我杀死了使用那个端口的任何进程。将我的配置文件重置回原始状态。现在blob、队列和表使用原始端口号。Azure存储模拟器已重新启动。现在神奇地400错误消失了。