2017-01-18 5 views
2

Nachdem ich die Dokumentation durchgelesen und versucht habe, andere Beispiele von Entwicklern zu finden, die diesen Fehler bekommen, stehe ich ein bisschen fest. Wir arbeiten mit NServiceBus 6 und erhalten gelegentlich einen System.MethodAccessException in unserem Message-Handler auf den Anruf return Task.CompletedTask. Es scheint nur dann aufzutreten, wenn der Handler in einer Azure-Worker-Rolle bereitgestellt wird (im Gegensatz zur Ausführung im Emulator). Wir verwenden den Azure Service Bus-Transport.Warum wirft dieser NServiceBus-Nachrichtenhandler System.MethodAccessException beim Aufruf von Task.CompletedTask?

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); 
    } 

Die eigentliche Ausnahme sieht wie folgt aus:

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:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\Incoming\Invok eHandlerTerminator.cs: line 24 
at NServiceBus.LoadHandlersConnector.<Invoke>d__1.MoveNext() in  C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\Incoming\LoadH andlersConnector.cs: line 40 
+0

zu ersetzen. Welche Version von .NET Framework verwendet Ihre Worker-Rolle? –

+0

Alles ist 4.6.1. Ich sehe Ihre Antwort unten und werde die Cloud-Service-Version überprüfen. –

Antwort

5

ich vermuten, dass Ihr Code lokal .NET Framework 4.6.x hat die Task.CompletedTask unterstützt. Wenn Sie in CS bereitstellen und OS family verwenden, wird weniger als Version 5 keine Unterstützung für 4.6.x haben. Sie müssen entweder eine Startaufgabe verwenden, um 4.6.x zu installieren, oder eine Migration zu OS Family 5 (Server 2016) durchführen.

+0

Sie haben Recht, wenn Sie darauf hinweisen, dass der Cloud-Dienst definitiv eine ältere Version ist. Sobald ich meine Bereitstellungsskripts einrichten kann, um sicherzustellen, dass wir die richtige Betriebssystemfamilie verwenden und verifizieren, werde ich dies als die Antwort markieren. –

3

Das ist seltsam. Gemessen an den Referenzquellen Task.CompletedTask kann ich nicht auf ein Szenario kommen, wo das passieren könnte. Die statisch zwischengespeicherte Task wird mit RAN_TO_COMPLETION und DO_NOT_DISPOSE initialisiert. Basierend darauf würde ich vorschlagen, dass Sie feststellen, ob Sie .NET Framework Version 4.6 oder höher verwenden. Wenn Sie dies tun und die Ausnahme weiterhin angezeigt wird, versuchen Sie, Task.CompletedTask durch

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