我需要能够调试以下控制台应用程序,以了解消息是否正确反序列化。
然而,当我在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);
}
或者如何重写此方法以返回对象?或者你会建议什么?
答案 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)并且问题已修复。