2016-07-21 26 views
3

Ich sehe einen Fehler in meinen Protokollen der Application Insight-Webanwendung, aber ich finde nicht, wo sie herkommt, und ich finde kein merkwürdiges Verhalten in meiner App oder im Web api (.NET 4.5 mit Web API 2.0, mit Output und Web Api 2 Cache, MongoDB in Azure wie Web App mit 2 Instanzen):Die Ausnahme (n) einer Aufgabe wurde nicht beobachtet

Eine Aufgabe der Ausnahme (n) wurden nicht beobachtet, entweder, indem Sie auf die Task-Warte oder den Zugriff auf seine Ausnahmeeigenschaft. Als Ergebnis wurde die unbeobachtete Ausnahme durch den Finalizer-Thread erneut ausgelöst.Objektverweis nicht auf eine Instanz eines Objekts festgelegt.

Ich kann nicht finden, wo der Fehler herkommt, ich Ihnen einige Beispiel-Code zeigen, ich bin eine Menge meiner Web Api und Javascript mit Hilfe der Daten zu erhalten:

Beispiel Controller:

public Task<IActionResult> GetDataFromMyMongoDB(string id){ 

     var data = await _service.GetData(id); 

     if(data == null) 
       return BadRequest("Error"); 

     return Ok(data); 
} 

Service:

public Task<ICollection<MyDto>> GetData(id) 
{ 
    //Check security operations for example, or business login like this: 

    var data = await _repositoryData.Where(d=>d.Id == id); 

    //For example, sometimes I do some business logic operations in which 
    // I use try ... catch (this code is just for show example code) 

    try 
    { 
     var dataToJson = JSON.parse(data); 

     //Dummy code dataJson to obtain a value of this and changed and update 
     //to repository 

     //** Code omited **// 

     var bool = await _repository.UpdateManyAsync(data); 

     if(bool == false) 
     return null; 

     else 
     { 
      //Here I do typical mapper operations from my 
      //entities to my DTOs 

      //** Code omited **// 

      return mappedListDto; // <-- Type: ICollection<MyDto> 
     } 

    } 
    catch(Exception ex) 
    { 
     //Log in Elmah 
     //Elmah stuff code here 

     //** Code omited **// 

     return null; 

    } 





} 

Mein Repository ist Standardcode für einfache Operationen und funktioniert gut in Komponententests, und ich habe meine Webanwendung viele Male und mehr als 100 Benutzer gleichzeitig ohne Probleme verwendet, aber in meinen Protokollen habe ich die Ausnahme Aufgabe.

Ich habe diese question und this one auch gelesen, aber ich kann nicht verstehen, wie in meinem Code anzuwenden, ich fühle mich dumm.

EDIT: Weitere Informationen: Ich habe etwa 500 Ausnahmen dieses Typs in den letzten 12 Stunden bekommen, aber die Anwendung funktioniert gut, in den letzten 12 Stunden habe ich etwa 167 K Anfrage.

Stack Trace:

System.AggregateException: 
System.NullReferenceException: 
    at System.Web.ThreadContext.AssociateWithCurrentThread (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 
    at System.Web.HttpApplication.OnThreadEnterPrivate (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 
    at System.Web.HttpApplication.System.Web.Util.ISyncContext.Enter (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 
    at System.Web.Util.SynchronizationHelper.SafeWrapCallback (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a) 
    at System.Threading.Tasks.Task.Execute (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089) 

Irgendwelche Ideen? Ich bin total verrückt danach ... Vielen Dank!

+1

10 Nichts sieht mir schief. Versuchen Sie, Ihren Stack-Trace zu posten. –

+0

@JonathanAllen Aktualisiert, danke für das Interesse ... – chemitaxis

+0

Verdammt, ich sehe da nichts Nützliches. Ich denke, du musst versuchen, einen Debugger anzuhängen und zu hoffen, dass etwas auslöst. –

Antwort

3

Es ist wahrscheinlich nichts falsch. Klingt wie AppInsights ist ein bisschen paranoid.

Dies wird am häufigsten durch eines von zwei Dingen verursacht.

Einer ist ein "warten auf jede" Art von logischen Fork in Ihrem Code. Dies ist normalerweise ein Code, der Task.WhenAny verwendet. Ich empfehle, den Code nach "WhenAny" zu suchen.

Die andere ist eine Art "Feuer und vergessen" Logik. Dies ist normalerweise Code, der Task.Run aufruft und ignoriert dann die zurückgegebene Aufgabe. Der Compiler ist ziemlich gut darin, Sie vor dem Code zu warnen (da es fast immer ein Fehler ist), also sollten Sie zuerst die Warnungen Ihres Compilers überprüfen.

Da Sie eine Komponententestsuite haben, können Sie einen Handler für TaskScheduler.UnobservedTaskException anschließen, der diese Ausnahmen abfängt, und dann Ihre Testsuite ausführen/debuggen und sehen, unter welchen Tests diese getroffen wird. Wenn Sie AppInsights stilllegen möchten, können Sie in Ihrem Produktionscode, der UnobservedTaskExceptionEventArgs.SetObserved aufruft, einen Handler hinzufügen.