【问题标题】:Testing development using Azure Storage Emulator [duplicate]使用 Azure 存储模拟器测试开发 [重复]
【发布时间】:2018-05-23 20:17:15
【问题描述】:

我正在使用 Azure Storage Emulator 版本在 Windows 10-x64 和 WindowsAzure.Storage 9.1.1 上测试 asp.net core 2.1-rc1 Web 应用程序。

我已按照本指南设置 Azure 存储模拟器。

https://docs.microsoft.com/en-us/azure/storage/common/storage-use-emulator

当我尝试创建 blob 容器时,出现以下异常:

Microsoft.WindowsAzure.Storage.StorageException: Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteAsyncInternal[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext, CancellationToken token) in C:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\WindowsRuntime\Core\Executor\Executor.cs:line 316
at Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.CreateIfNotExistsAsync(BlobContainerPublicAccessType accessType, BlobRequestOptions options, OperationContext operationContext, CancellationToken cancellationToken) in C:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\WindowsRuntime\Blob\CloudBlobContainer.cs:line 165

Request Information
RequestID:c4a44dcc-301e-002e-5ad0-f2637a000000
RequestDate:Wed, 23 May 2018 22:02:36 GMT
StatusMessage:Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
ErrorCode:AuthenticationFailed
ErrorMessage:Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:c4a44dcc-301e-002e-5ad0-f2637a000000
Time:2018-05-23T20:02:36.9987818Z

我在异常附加信息中发现了这一点:-

"The MAC signature found in the HTTP request 'NeZGAEspShTRdpc/zFH++pS9YChlOczzEg0vcVGXF10=' is not the same as any computed signature. Server used following string to sign: 'PUT\n\n\n\n\n\n\n\n\n\n\n\nx-ms-client-request-id:e4b5b43c-ba27-45b1-8545-19db1c16a160\nx-ms-date:Wed, 23 May 2018 19:10:31 GMT\nx-ms-version:2017-07-29\n/devstoreaccount1/admins\nrestype:container'."

这是我的代码:-

public static async Task InitializeContainersAsync()
{
    try
    {
        //Use the emulator default credenitals
        var credentials = new StorageCredentials("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");
        CloudStorageAccount storageAccount = new CloudStorageAccount(credentials, false);

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        CloudBlobContainer container = blobClient.GetContainerReference("testing_container");

        await container.CreateIfNotExistsAsync();
    }
    catch (StorageException ex)
    {
        Console.WriteLine(ex);
    }
}

【问题讨论】:

  • 你使用的是什么版本的存储模拟器?
  • 我正在使用 v 5.3.17342.2050
  • 您对这个项目有应用见解吗?我记得应用洞察将标头注入请求的问题,这导致 MAC 签名无效
  • 不,应用洞察不包含在项目中

标签: c# azure asp.net-core azure-storage azure-emulator


【解决方案1】:

如果您想使用存储模拟器,实际上有两种选择。

  1. 最简单的一种是使用连接字符串UseDevelopmentStorage=true

从应用程序连接到存储模拟器的最简单方法是在应用程序的配置文件中配置一个连接字符串,该文件引用快捷方式 UseDevelopmentStorage=true。以下是 app.config 文件中存储模拟器的连接字符串示例:

<appSettings>
  <add key="StorageConnectionString" value="UseDevelopmentStorage=true" />
</appSettings>
  1. 如果您想自己构建连接字符串,您还需要指定要连接的服务的端点。摘自您链接到的文章:

要创建引用模拟器帐户名称和密钥的连接字符串,您必须在连接字符串中为您希望从模拟器中使用的每个服务指定端点。这是必要的,以便连接字符串将引用与生产存储帐户不同的模拟器端点。例如,您的连接字符串的值将如下所示:

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;

【讨论】:

  • 感谢您的回答,添加端点解决了 StorageException 但我遇到了另一个与此链接中描述的相同的异常:- stackoverflow.com/questions/46311458/… 将模拟器更新到最新版本解决了问题。跨度>
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多