blob的创建给403 Forbidden消息
我正尝试使用Azure存储模拟器来处理blob存储。 我似乎无法让它工作,并浪费了整整一天的努力而没有成功。 即使这是开发人员存储,我仍然收到403禁止的错误。 我希望有人能帮助我。
我以前曾在Azure上成功运行过这个程序。 然而,我的3个月试用期过期了,我根本没有真正使用它,现在我已经回过头来看看Azure,我必须在存储器模拟器上运行(将连接字符串更改为dev存储器后)。
我会详细描述我所做的。
首先让我向你保证我已经安装了所有必要的东西(我认为):
我有Visual Studio 2012 Pro和Visual Studio 2012 Express for Web(这是免费的)。 我使用Web Platform安装程序安装了Azure所需的附加内容。 如果我查看添加/删除程序,我看到我有
如果需要,我可以在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