为什么这个 NServiceBus 消息处理程序在调用 Task.CompleteTask 时会抛出 System.Me



在查看文档并尝试找到开发人员遇到此错误的其他示例后,我有点卡住了。 我们正在使用 NServiceBus 6,并且偶尔会在调用 return Task.CompletedTask 时在我们的消息处理程序中得到System.MethodAccessException。 它似乎仅在 Azure 辅助角色中部署处理程序(而不是在模拟器中运行)时发生。 我们正在使用 Azure 服务总线传输。

  public Task Handle(UpdatePatientAccommodationCode message, IMessageHandlerContext context)
    {
        Console.WriteLine($"Handling [{message.GetType()}]");
        var patientVisit = LoadByExternalPatientId(message.ClientId, message.ExternalPatientId);
        var mappedEvent = patientVisit.HandleCommand(message);
        if (patientVisit.IsEventAdded)
            PatientVisitEventStore.Save(patientVisit);
        return mappedEvent == null ? Task.CompletedTask : context.Publish(mappedEvent);
    }

实际异常如下所示:

System.MethodAccessException: Attempt by method 'XXX.Handlers.PatientVisitHandler.Handle(XXX.UpdatePatientAccommodationCode, NServiceBus.IMessageHandlerContext)' to access method 'System.Threading.Tasks.Task.get_CompletedTask()' failed.
at XXX.Handlers.PatientVisitHandler.Handle(UpdatePatientAccomm     odationCode message, IMessageHandlerContext context) in PatientVisitHandler.cs:  line 314
at NServiceBus.InvokeHandlerTerminator.Terminate(IInvokeHandlerContext context)       in   C:BuildAgentwork3206e2123f54fce4srcNServiceBus.CorePipelineIncomingInvok  eHandlerTerminator.cs: line 24
at NServiceBus.LoadHandlersConnector.<Invoke>d__1.MoveNext() in     C:BuildAgentwork3206e2123f54fce4srcNServiceBus.CorePipelineIncomingLoadH   andlersConnector.cs: line 40

我怀疑您的代码在本地具有支持 Task.CompletedTask 的 .NET Framework 4.6.x。部署到 CS 并使用低于版本 5 的操作系统系列时,将不支持 4.6.x 你将需要使用启动任务来安装 4.6.x 或迁移到操作系统系列 5 (Server 2016)。

很奇怪。从Task.CompletedTask的参考来源来看,我无法想出可能发生这种情况的情况。静态缓存的任务使用 RAN_TO_COMPLETIONDO_NOT_DISPOSE 进行初始化。基于此,我建议您确定使用的是.NET Framework 4.6或更高版本。如果这样做并且仍然看到异常,请尝试将Task.CompletedTask替换为

static class TaskEx
{
   public static readonly Task CompletedTask = Task.FromResult(0); 
} 

最新更新