无法在控制台应用程序上使用 QueueClient.OnMessage 进行调试

Cant debug Using QueueClient.OnMessage on a console app

我需要能够调试以下控制台应用程序以了解消息是否正确反序列化。

但是,当我在 visual studio 上按 F5 时,我可以调试这一行:

string mensaje = message.GetBody();

但是下面这行好像没有执行,控制台APP关闭了,连我写到控制台的信息都看不到了。我最好的猜测是因为使用 OnMessage 进行异步调用的性质。但我不确定。

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
                Console.WriteLine("Press key to continue");
                Console.ReadKey();
                QueueHelper.ReceiveMessageEmpresa("Empresa", connectionString);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

public static void ReceiveMessageEmpresa(string queuName, string connectionString)
        {
            QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "Empresa");

            // Configure the callback options
            OnMessageOptions options = new OnMessageOptions();
            options.AutoComplete = false;
            options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

            // Callback to handle received messages
            Client.OnMessage((message) =>
            {
                try
                {
                    string mensaje = message.GetBody<string>();
                    Empresa empresa = JsonConvert.DeserializeObject<Empresa>(mensaje);
                    // Process message from queue
                    //Console.WriteLine("Body: " + );
                    Console.WriteLine("MessageID: " + message.MessageId);
                    Console.ReadKey();

                    // Remove message from queue
                    message.Complete();
                }
                catch (Exception ex)
                {
                    // Indicates a problem, unlock message in queue
                    message.Abandon();
                }
            }, options);
        }

或者如何将此方法重写为 return 对象?或者你有什么建议?

我们今天下午 运行 解决了这个确切的问题,在逐行取出代码后发现它与使用 Newtonsoft 有关。如果您注释掉您的行:

Empresa empresa = JsonConvert.DeserializeObject<Empresa>(mensaje);

您应该会发现它有效。

我们通过将 JsonConvert 功能包装在我们从 OnMessage 方法调用的另一个 class 中来解决这个问题。

不幸的是,我不知道为什么会这样,但我希望这对您有所帮助!

哇...我也遇到过这个问题。

尝试调试它的时间(因为它什么都不做)并发现 Newtonsoft.JSON 与 Azure Worker Role 结合的潜在问题。

Newtonsoft 软件包安装正常。在我的测试环境中。一切正常。我一运行工人,它就坐在那里没有清空队列。

所以...在部署到 Azure 之前,如果您遇到这种情况,请再次重新安装 Nuget 包(或使用 downgrade/update)。如果注释掉 SerializeObject 或 DeserializeObject 调用,您还可以在本地快速调试此问题。或者将调用移到 Client.OnMessage 语句之外,然后您将看到错误。

从 Client.OnMessage() 函数中将消息处理逻辑提取到一个单独的方法中,最终引发了异常(否则它会静默失败)。 我的问题是 Newtonsoft.Json Nuget 包的不同版本安装在我的解决方案的项目中。 我不得不将它们全部更新到最新版本 (9.0.1),问题已解决。