blob的创建给403 Forbidden消息

我正尝试使用Azure存储模拟器来处理blob存储。 我似乎无法让它工作,并浪费了整整一天的努力而没有成功。 即使这是开发人员存储,我仍然收到403禁止的错误。 我希望有人能帮助我。

我以前曾在Azure上成功运行过这个程序。 然而,我的3个月试用期过期了,我根本没有真正使用它,现在我已经回过头来看看Azure,我必须在存储器模拟器上运行(将连接字符串更改为dev存储器后)。

我会详细描述我所做的。

首先让我向你保证我已经安装了所有必要的东西(我认为):

我有Visual Studio 2012 Pro和Visual Studio 2012 Express for Web(这是免费的)。 我使用Web Platform安装程序安装了Azure所需的附加内容。 如果我查看添加/删除程序,我看到我有

  • 适用于Microsoft Visual Studio 2012的Windows Azure工具-v2.1
  • 用于.NET的Windows Azure库-v2.1
  • Windows Azure模拟器-v2.1
  • Windows Azure创作工具-v2.1
  • 如果需要,我可以在VS2012中创建一个云项目,并且如果我在模拟器上成功启动它。 所以看来我的问题只存在于模拟器存储中。

    这是我所做的:

    步骤1。

    我创建了一个新的ASP.NET MVC4项目。 我正在使用.NET框架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

    第3步。

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

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

    步骤4。

    在HomeController.cs中,我创建一个Action。 此操作应该在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:TUTORIALSWindows AzureAzure NOTES and stufftable.jpg"))
            {
                blockBlob.UploadFromStream(fileStream);
            }
    
            return Content("Blob uploaded to container on storage emulator");
        }
    

    第5步。

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

    第6步。

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

    现在我转到调试>开始调试,然后按照预期在本地主机:57810的浏览器窗口中启动该站点。

    如果我导航到

    http://localhost:57810/Home/AddBlobToBlobContainerStorageEmulator
    

    它应该激发我的Action方法。

    相反,我明白了

    在这里输入图像描述

    第118行是红色的....所以基本上不能创建容器。

    有人可以告诉我这里有什么问题吗? 我是否需要以某种方式向开发存储模拟器添加一些权限? 我不明白为什么它说Forbidden。

    我想知道是否在我的机器上出现了问题,或者Azure之间可能存在冲突。 我的项目中的dll版本是否对开发模拟器不正确? 或者也许在v2.1中有一个错误?

    我已经解释了我是如何制作我的项目的,但如果有人想尝试运行它,我会愿意上传整个项目。

    感谢您提供任何帮助。


    坦率地说,我有点恼火,原来的代码不起作用。 毕竟,微软的MSDN文章(https://azure.microsoft.com/en-us/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在云中的密钥不是您提供的密钥, 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";
    

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

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


    我想到了!! 或者更恰当的,我在这里找到了答案: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/en-us/library/windowsazure/hh403989.aspx)明确指出我们应该使用:

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

    那么,为什么这样做不起作用? 该文章于2012年7月更新,因此不完全过时。 这么多小时浪费了......但至少我现在可以睡觉了,知道我终于有了工作:)


    正如在之前的帖子中提到的,请不要使用“devstoreaccount1”帐户连接到Azure存储模拟器。 相反,只能使用“”UseDevelopmentStorage = true“”作为连接字符串并附加devstorage数据库,而不要使用“devstoreaccount1”。

    完整的例子:在配置:

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

    在代码中:

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

    现在通过存储资源管理器或服务器资源管理器(VSTS)连接到devStorage帐户,并监控您的数据库操作。

    链接地址: http://www.djcxy.com/p/66105.html

    上一篇: blob creation gives 403 Forbidden message

    下一篇: listblobs in $logs container