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 来帮助解决这些问题。
我使用 .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 来帮助解决这些问题。