不能使用QueueClient进行调试.控制台应用程序上的OnMessage

本文关键字:应用程序 应用 程序上 OnMessage 控制台 调试 QueueClient 不能 | 更新日期: 2023-09-27 18:01:48

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

但是,当我在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);
        }

或者我如何重写这个方法来返回对象?或者你有什么建议?

不能使用QueueClient进行调试.控制台应用程序上的OnMessage

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

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

你会发现它是有效的。

我们已经绕过这个包装JsonConvert功能在另一个类,我们从我们的OnMessage方法调用。

我不知道为什么这是不幸的情况,但我希望这有助于!

哇…我也有过这样的问题。

经过几个小时的调试(因为它显然什么都不做),发现了Newtonsoft的潜在问题。JSON与Azure Worker Role的组合。

Newtonsoft Package安装得很好。在我的测试环境中。一切都很正常。当我运行worker时,它只是坐在那里,没有清空队列。

所以…在部署到Azure之前,如果遇到这种情况,请重新安装Nuget包(或使用降级/更新)。如果注释掉SerializeObject或DeserializeObject调用,也可以在本地快速调试此问题。或者将调用移到客户端之外。OnMessage语句,然后你会看到错误

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