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);
}

该教程为

提供指导
  1. 下载解决方案源文件并从Visual Studio
  2. 打开
  3. 或使用 Visual Studio
  4. 从头开始​​创建解决方案

该解决方案在使用下载的源文件时工作正常。在工人角色中,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。