Windows Azure 队列 - CloudQueue.GetMessage() 不适用于最新版本的 Microsoft.WindowsAzure.Storage (v5.0.0)
Windows Azure Queue - CloudQueue.GetMessage() not working for latest version of Microsoft.WindowsAzure.Storage (v5.0.0)
我是 Azure 的新手,正在试用教程 here。
本教程是关于利用 Web 角色将任务委托给辅助角色在 Azure 上创建云服务。唯一重要的部分;当用户将图像上传到 Web 角色时,Web 角色会将图像放入 Azure 存储并在数据库中创建一个新记录,其中包含存储图像的 URL 字段。 Web Role 接下来在 Azure Queue 中放置一条消息(新添加记录的 ID)。
var queueMessage = new CloudQueueMessage(id);
await _cloudQueue.AddMessageAsync(queueMessage);
工作者角色然后将从队列中检索消息。接下来,从数据库中检索记录。然后从检索到的数据库记录的图像 url 创建缩略图。
while (true) {
var msg = _cloudQueue.GetMessage();
if (msg != null) {
CreateThumbnail();
}
System.Threading.Thread.Sleep(1000);
}
该教程为
提供指导
- 下载解决方案源文件并从Visual Studio
打开
- 或使用 Visual Studio
从头开始创建解决方案
该解决方案在使用下载的源文件时工作正常。在工人角色中,var msg = _cloudQueue.GetMessage();
.
msg
总是有一些东西(不为空),尽管在上传图像后有 3 到 4 秒的延迟。因此CreateThumbnail()
总是在图片上传后3到4秒执行。
但是,如果我要从头开始创建解决方案,无论我等待多长时间,msg
始终为 null,而且 CreateThumbnail
从未执行过。我通过在各处放置断点来确保 Worker Role 确实是 运行。
问题的根源
经过几个小时的艰苦努力,我将问题归结为程序集Microsoft.WindowsAzure.Storage
。
从教程页面下载的解决方案源文件使用的是 3.2.0 版,而从头开始创建的解决方案使用的是 NuGet 的最新版本 5.0.0。因此,换句话说,如果我在辅助角色上使用 Microsoft.WindowsAzure.Storage
的最新版本 5.0.0,msg
始终为 null。这是一个已知问题还是我遗漏了什么。
很抱歉您在使用本教程时遇到了困难。我已经与教程的所有者核对过,最近更新了它(大约 9 月 1 日)。请下载新版本的Visual Studio解决方案并重试。
本教程的 troubleshooting 部分概述了一些需要牢记的事项:
- 将启动项目更改为 ContosoAdsCloudService
- 运行 Visual Studio 作为管理员,并指定解决方案应该 运行 使用完整的计算模拟器而不是 express 模拟器。
来自教程:
默认情况下,新的云服务项目使用 Azure compute emulator express 来模拟 Azure 环境。这是完整计算模拟器的轻量级版本,在某些情况下,完整模拟器可以工作,而 express 版本不能。
要将项目更改为使用完整模拟器,请右键单击 ContosoAdsCloudService 项目,然后单击“属性”。在“属性”window 中单击“Web”选项卡,然后单击“使用完整模拟器”单选按钮。
为了 运行 具有完整模拟器的应用程序,您必须使用管理员权限打开 Visual Studio。
我是 Azure 的新手,正在试用教程 here。
本教程是关于利用 Web 角色将任务委托给辅助角色在 Azure 上创建云服务。唯一重要的部分;当用户将图像上传到 Web 角色时,Web 角色会将图像放入 Azure 存储并在数据库中创建一个新记录,其中包含存储图像的 URL 字段。 Web Role 接下来在 Azure Queue 中放置一条消息(新添加记录的 ID)。
var queueMessage = new CloudQueueMessage(id);
await _cloudQueue.AddMessageAsync(queueMessage);
工作者角色然后将从队列中检索消息。接下来,从数据库中检索记录。然后从检索到的数据库记录的图像 url 创建缩略图。
while (true) {
var msg = _cloudQueue.GetMessage();
if (msg != null) {
CreateThumbnail();
}
System.Threading.Thread.Sleep(1000);
}
该教程为
提供指导- 下载解决方案源文件并从Visual Studio 打开
- 或使用 Visual Studio 从头开始创建解决方案
该解决方案在使用下载的源文件时工作正常。在工人角色中,var msg = _cloudQueue.GetMessage();
.
msg
总是有一些东西(不为空),尽管在上传图像后有 3 到 4 秒的延迟。因此CreateThumbnail()
总是在图片上传后3到4秒执行。
但是,如果我要从头开始创建解决方案,无论我等待多长时间,msg
始终为 null,而且 CreateThumbnail
从未执行过。我通过在各处放置断点来确保 Worker Role 确实是 运行。
问题的根源
经过几个小时的艰苦努力,我将问题归结为程序集Microsoft.WindowsAzure.Storage
。
从教程页面下载的解决方案源文件使用的是 3.2.0 版,而从头开始创建的解决方案使用的是 NuGet 的最新版本 5.0.0。因此,换句话说,如果我在辅助角色上使用 Microsoft.WindowsAzure.Storage
的最新版本 5.0.0,msg
始终为 null。这是一个已知问题还是我遗漏了什么。
很抱歉您在使用本教程时遇到了困难。我已经与教程的所有者核对过,最近更新了它(大约 9 月 1 日)。请下载新版本的Visual Studio解决方案并重试。
本教程的 troubleshooting 部分概述了一些需要牢记的事项:
- 将启动项目更改为 ContosoAdsCloudService
- 运行 Visual Studio 作为管理员,并指定解决方案应该 运行 使用完整的计算模拟器而不是 express 模拟器。
来自教程:
默认情况下,新的云服务项目使用 Azure compute emulator express 来模拟 Azure 环境。这是完整计算模拟器的轻量级版本,在某些情况下,完整模拟器可以工作,而 express 版本不能。
要将项目更改为使用完整模拟器,请右键单击 ContosoAdsCloudService 项目,然后单击“属性”。在“属性”window 中单击“Web”选项卡,然后单击“使用完整模拟器”单选按钮。
为了 运行 具有完整模拟器的应用程序,您必须使用管理员权限打开 Visual Studio。