Azure存储模拟器-Blob创建给出403禁止消息

asp.net-mvc azure

7828 观看

5回复

623 作者的声誉

我正在尝试使用Azure存储模拟器来处理Blob存储。我似乎无法使它正常工作,并且浪费了一整天的时间尝试而没有成功。即使这是开发人员存储空间,我仍然收到403禁止错误。我希望这里有人可以帮助我。

我以前曾在Azure上成功运行过同一程序。但是,我没有真正使用它的3个月试用期已过期,现在我又回到了查看Azure的角度,我必须在存储模拟器上运行(将连接字符串更改为dev storage之后)。

我将详细描述我的工作。

首先让我向您保证,我已经安装了所有必要的工具(我认为):

我同时拥有Visual Studio 2012 Pro和Visual Studio 2012 Express for Web(免费)。我已经使用Web平台安装程序安装了Azure所需的其他内容。如果我在“添加/删除程序”中查看,

  • 适用于Microsoft Visual Studio 2012 -v2.1的Windows Azure工具
  • 适用于.NET -v2.1的Windows Azure库
  • Windows Azure模拟器-v2.1
  • Windows Azure创作工具-v2.1

如果需要,我可以在VS2012中创建一个云项目,并且如果我成功执行,它将在模拟器上成功启动。因此,似乎我的问题仅在于模拟器存储。

这是我所做的:

第1步。

我创建一个新的ASP.NET MVC4项目。我正在使用.NET Framework 4.5。这将使用HomeController.cs和AccountController.cs创建基本项目模板

第2步。

我使用NuGet来获取“ Windows Azure存储”。我相信这会将WindowsAzure.Storage.dll版本2.0.6.1放入我的项目引用中。除此之外,我还看到我的引用还包括-Microsoft.WindowsAzure.Configuration v2.0.0.0 -Microsoft.WindowsAzure.Diagnostics v2.1.0.0 -Microsoft.WindowsAzure.ServiceRuntime v2.1.0.0 -Microsoft.WindowsAzure.StorageClient v1 .7.0.0

第三步

在Web.config文件中,我在标签内添加以下标签

这基本上是每个人在使用模拟器时都应该使用的帐户名和密钥。

第四步。

在HomeController.cs中,我创建一个动作。该操作应在Azure blob存储上创建一个容器,并将文件上传到该容器。这是代码。如您所见,它几乎是您在初学者示例中找到的标准代码


    public ActionResult AddBlobToBlobContainerStorageEmulator()
    {
        // Retrieve storage account from connection string
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["EmulatorStorageConnectionString"]);

        // Create the blob client.
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve a reference to the previously created container. 
        CloudBlobContainer container = blobClient.GetContainerReference("myemulatortcont");

        // Create the container if it doesn't already exist.
        container.CreateIfNotExists();


        // Retrieve reference to a blob named "mytestblob".
        CloudBlockBlob blockBlob = container.GetBlockBlobReference("myemulatortestblob.jpg");

        // Create or overwrite the "mytestblob" blob with contents from a local file.
        using (var fileStream = System.IO.File.OpenRead(@"E:\TUTORIALS\Windows Azure\Azure NOTES and stuff\table.jpg"))
        {
            blockBlob.UploadFromStream(fileStream);
        }

        return Content("Blob uploaded to container on storage emulator");
    }

步骤五

我确保已启动计算模拟器:“开始”>“所有程序”>“ Windows Azure”>“模拟器”>“ Windows Azure计算模拟器”

第六步

就这样。我没有创建云项目或任何项目,因此在运行该项目时,它将根据项目属性(也称为IIS Express)在“本地IIS Web服务器”上运行。

现在,我进入“调试”>“开始调试”,它会按预期在localhost:57810的浏览器窗口中启动站点。

如果我导航到

http://localhost:57810/Home/AddBlobToBlobContainerStorageEmulator

它应该触发我的Action方法。

相反,我看到了

在此处输入图片说明

第118行为红色...。因此,基本上无法创建容器。

有人可以告诉我这是怎么回事。我是否需要以某种方式向开发存储模拟器添加一些权限?我不明白为什么说禁止。

我想知道我的计算机上是否存在某些问题,或者Azure之间是否存在某些冲突。我的项目中的dll版本对于开发模拟器是否有些不正确?还是v2.1中存在错误?

我已经确切地解释了我如何制作项目,但是如果有人想要尝试运行它,我愿意上传整个内容。

感谢您提供任何帮助。

作者: Gary 的来源 发布者: 2013 年 8 月 16 日

回应 (5)


4

623 作者的声誉

我想到了!!或更恰当地说,我在这里找到了答案:https : //stackoverflow.com/a/17500876/1400153

在上面发布的代码中,我更改了代码行

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["EmulatorStorageConnectionString"]);

var connectionString = "UseDevelopmentStorage=true";
var storageAccount = CloudStorageAccount.Parse(connectionString);

从字面上看,这是我对代码所做的唯一更改。

另外,我右键单击Windows任务栏中的“模拟器”图标>“显示存储模拟器UI”,然后单击“重置”按钮。不确定这是否有帮助,我只是在记录我为下一个陷入困境的家伙所做的两件事。

现在可以了...

坦率地说,我对原始代码无法正常工作感到恼火。毕竟,Microsoft的MSDN文章(http://msdn.microsoft.com/zh-cn/library/windowsazure/hh403989.aspx)明确指出,我们应该使用:

帐户名称:devstoreaccount1帐户密钥:Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq / K1SZFPTOtr / KBHBeksoGMGw ==

那么,为什么这没用呢?该文章于2012年7月更新,因此并没有完全过时。浪费了很多时间...但是至少我现在可以入睡了,因为我知道我终于有了一些工作:)

作者: Gary 发布者: 16.08.2013 04:42

18

78485 作者的声誉

决定

坦率地说,我对原始代码无法正常工作感到恼火。毕竟,Microsoft的MSDN文章(https://azure.microsoft.com/zh-cn/documentation/articles/storage-use-emulator/)明确指出,我们应该使用:

帐户名称:devstoreaccount1帐户密钥:Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq / K1SZFPTOtr / KBHBeksoGMGw ==

那么,为什么这没用呢?

基本上,存储模拟器的端点与云存储帐户的端点不同。例如,云存储帐户的默认Blob端点为,http://[youraccount].blob.core.windows.net而存储模拟器的Blob端点为http://127.0.0.1:10000。当您在连接字符串中指定存储模拟器的存储帐户名称和密钥时,存储客户端库会将其视为云存储帐户,并尝试http://devstoreaccount1.blob.core.windows.net使用您提供的帐户密钥进行连接。由于devstoreaccount1云中的密钥不是您提供的密钥,因此会出现403错误。

如果要使用帐户名和密钥连接到存储模拟器,则需要提供其他详细信息,例如不同的端点。因此,您的连接字符串将类似于:

var connectionString = @"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;";

请注意我在连接字符串中指定的端点。

var connectionString = "UseDevelopmentStorage=true";

上面的代码只是我上面指定的大连接字符串的简写形式。

希望这可以澄清您的疑问。

作者: Gaurav Mantri 发布者: 16.08.2013 05:04

0

788 作者的声誉

如先前文章所述,请不要使用“ devstoreaccount1”帐户连接到Azure存储模拟器。而是仅使用““ UseDevelopmentStorage = true”“作为连接字符串,并附加附加的devstorage DB,而不是“ devstoreaccount1”。

完整的示例:在配置中:

  add name ="ConnString" connectionString="UseDevelopmentStorage=true"
.....

在代码中:

   string connStr = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;            
   CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connStr);

现在,通过Storage Explorer或Server Explorer(VSTS)连接到devStorage帐户,并监视数据库操作。

作者: Avijit Chatterjee 发布者: 17.01.2014 03:43

0

516 作者的声誉

container.SetPermissions(
                    new BlobContainerPermissions
                    {
                        PublicAccess =
                            BlobContainerPublicAccessType.Blob
                    });

初始化连接时。但是首先,使用客户端进行存储,并使用客户端更改容器的权限。

为我工作;)

作者: Jonathan Molina 发布者: 30.03.2016 07:00

1

797 作者的声誉

刚刚看到了WindowsAzure.Storage 8.6.0。我跟着这个问题的意见,并为我工作的解决方法是添加以下ExcludeComponentCorrelationHttpHeadersOnDomainsApplicationInsights.config

<Add>localhost</Add>
<Add>127.0.0.1</Add>

似乎在某个时候引入了回归,导致AI修改了对仿真器的请求的标头,从而导致403 Forbidden错误。

作者: Rimmel 发布者: 18.11.2017 07:08
32x32