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

时间:2015-07-08 23:34:34

标签: c# console-application azure-servicebus-queues

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

然而,当我在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);
        }

或者如何重写此方法以返回对象?或者你会建议什么?

3 个答案:

答案 0 :(得分:1)

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

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

你会发现它有效。

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

我不知道为什么会出现这种情况,但我希望这会有所帮助!

答案 1 :(得分:1)

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

尝试调试此操作的时间(因为它几乎没有做任何事情),并发现Newtonsoft.JSON与Azure辅助角色组合的潜在问题。

Newtonsoft Package安装得很好。在我的测试环境中。一切都有效。我一跑完工人就坐在那里,没有清空队列。

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

答案 2 :(得分:0)

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