Nservice消息字段问题

Nservice message field issue

我使用 .net 和 NServiceBus 版本 7 在我的代码中实现了语音呼叫。 下面是发送语音呼叫的代码片段:

public Task Handle(AddServiceAuto message, IMessageHandlerContext context)
{
    try
    {
        string VoiceCallCode = null;
        Guid userID = User.userID;
        VoiceCallCode = GetVoiceCallCode(userID);
       if (VoiceCallCode != null)
        {
            publishAddVoiceCallEvent(context, user.caseID, userID.Mobile, 
                userID.Voicecall, VoiceMessageText, VoiceCallCode);
        }
    }
}

private void publishAddVoiceCallEvent(IMessageHandlerContext context, 
    Guid caseID, string mobile, bool voicecall, 
    string voiceMessageText, string voiceCallCode)
{
    AddVoiceCallEvent addVoiceCallEvent = new AddVoiceCallEvent()
    {
        CaseID = caseID,
        Mobile = mobile,
        Voicecall = voicecall,
        VoiceMessageText = voiceMessageText,
        VoiceCallCode = voiceCallCode
    };

    context.Publish(addVoiceCallEvent).ConfigureAwait(false);
}

public Task Handle(AddVoiceCallEvent message, IMessageHandlerContext context)
{
    try
    {
        Logger.InfoFormat("message.CaseID: {0}", message.CaseID);

        Logger.InfoFormat("message.Voicecall= {0}", message.Voicecall);
        Logger.InfoFormat("message.Mobile {0}", message.Mobile);
        Logger.InfoFormat("message.VoiceCallCode {0}", message.VoiceCallCode);
        // The user should satisfy below conditions in order to receive a voice call. 

        if ((message.Voicecall) && !string.IsNullOrEmpty(message.Mobile) && 
            !string.IsNullOrEmpty(message.VoiceMessageText) && 
            !string.IsNullOrEmpty(message.VoiceCallCode))
        {
            Voicecall(message.Mobile, message.Voicecall, 
                message.VoiceMessageText, message.VoiceCallCode);
        }
        else
        {
            Logger.Error("Mobile Value is Empty (OR) Voicecall is False (OR) 
                + VoiceMessageText is Empty (OR) VoiceCallCode is Empty");
        }
    }
}

如果条件满足则发送语音呼叫,否则打印日志。

问题: 语音呼叫是随机的,即有时用户正在接收语音呼叫,有时则没有(即使具有相同的设置,即移动,VoiceCallCode 值正确存储在数据库中,Voicecall 也是如此) 奇怪的是,虽然值正确存储在数据库中,但当我们查看正在打印的日志时,它显示 Mobile 的值,VoiceCallCode 为 null,Voicecall 为 false。 5 分钟后,我再次尝试,它成功了。

还有一件事是,当语音通话不起作用时。

Logger.InfoFormat("message.CaseID: {0}", message.CaseID); // CaseID printed

对于以下内容,即使数据在数据库中可用(即打印为空),也不会打印数据

Logger.InfoFormat("message.Voicecall= {0}", message.Voicecall);
Logger.InfoFormat("message.Mobile {0}", message.Mobile);
Logger.InfoFormat("message.VoiceCallCode {0}", message.VoiceCallCode);

奇怪的是,对于 CaseID,它打印了,而对于其他的,它没有打印。

为什么会这样?有人可以帮忙吗?

您共享的代码似乎不是 运行 代码(try w/o 捕获)因此很难查明是什么导致了问题。但随机行为可能是由于异步 API 使用不当造成的。处理程序方法应该 return a Task 或使用 async/await。在 IMessageHandlerContext.

上调用的操作也是如此

例如,publishAddVoiceCallEvent 应该 returning a Task 而不是 void。其中的代码 (context.Publish(addVoiceCallEvent).ConfigureAwait(false);) 应该是 return context.Publish(addVoiceCallEvent);await context.Publish(addVoiceCallEvent).ConfigureAwait(false);.

NServiceBus 附带 Rozlyn analyzer 来帮助解决这些问题。