HttpClient.PostAsJsonAsync stürzt ab, ohne eine Ausnahme auszulösen

9

Ich habe eine ASP.NET MVC-App mit WebAPI-Controllern und eine Konsolenanwendung, die diese Controller verwendet. Die Konsolenanwendung wird von einer geplanten Aufgabe ausgeführt und ruft Daten aus Remotequellen ab, analysiert sie und sendet sie an die MVC-App, bevor sie beendet wird.

Dies funktioniert gut für mehrere Controller, aber einer der Aufrufe stürzt die Konsolenanwendung ab, ohne eine Ausnahme auszulösen. Der Anrufercode, der für alle Controller verwendet wird:

%Vor%

Das Programm wird beendet, wenn await httpClient.PostAsJsonAsync(url, data) aufgerufen wird. Durch die Verwendung von Breakpoints werden weder der catch -Block noch die if -Anweisung erreicht. Der Aufruf wird jedoch ausgeführt, da der Web-API-Controller mit den richtigen Daten aufgerufen wird.

Die Programme teilen sich den gleichen Code für das T , das über den API-Aufruf übergeben wird.

Aus dem Ausgabefenster:

  

Das Programm '[9640] ProgramName.vshost.exe: Managed (v4.0.30319)' wurde mit dem Code 0 (0x0) beendet.

Ich habe mich gefragt, ob die Größe der geposteten Daten ein Problem sein könnte, aber ich habe keine Dokumentation gefunden, die Größenbeschränkungen angibt.

Meine Fragen sind also:

  1. Was könnte dazu führen, dass die Konsolenanwendung vorzeitig beendet wird?
  2. Wie kann ich dies erkennen und verhindern, dass das Programm beendet wird?
harriyott 16.04.2013, 08:55
quelle

5 Antworten

1

Eines der möglichen Probleme, dass Sie nicht await Ausführung der Post-Methode ausführen. Hier ist eine vereinfachte Version von dem, worüber ich spreche:

%Vor%

testAction wird beim zweiten Warten-Task abgebrochen, und die Konsole wird mit 0 beendet. Und die Ausgabe wird sein:

%Vor%

In meinem Fall würde ich einfach Console.ReadKey() call am Ende der Main-Methode hinzufügen. In Ihrem Fall könnte etwas anderes erforderlich sein

    
Uriil 25.04.2014 06:09
quelle
0
  1. Sobald Sie auf "hit" tippen, wird die Kontrolle an den Aufrufer von Post zurückgegeben.

  2. Verwenden Sie ContinueWith nicht mehr in der post-Methode, sondern geben Sie Folgendes ein: Taskfortsetzung im UI-Thread " oder Warten Sie auf die zurückgegebene Task: Ссылка

HadleyHope 16.04.2013 12:35
quelle
0

Ich würde vorschlagen zu testen, ob der JSON.Net Serializer in der Lage ist, Ihren Typ zu serialisieren.

    
Darrel Miller 16.04.2013 14:15
quelle
0

"mit Code 0 beendet" bedeutet, dass das Programm ordnungsgemäß beendet wurde. So kann es sein, dass der Aufrufer von Post<T> oder sogar über Callern feststellt, dass es Zeit war, das Programm zu beenden. Wenn Sie mit Debugging-Tools wie WinDbg vertraut sind, können Sie native Breakpoints bei ntdll-Funktionen setzen, um den Fall weiter zu diagnostizieren, aber normalerweise müssen Sie nur Ihre Codebasis überprüfen.

    
Lex Li 23.04.2014 02:51
quelle
0

Bitte werfen Sie einen Blick auf diese Frage, die einige Ausnahmen aufzählt, die Sie behandeln müssen:

.NET Global-Ausnahmehandler in der Konsolenanwendung

> %Vor%

Beachten Sie auch diesen Ansatz für Task-Ausnahmen:

%Vor%

Sie können mehr Details in einer der Antworten dieser Frage finden:

Ausnahme abfangen, die in einen anderen Thread geworfen wird

    
csharpwinphonexaml 29.04.2014 18:40
quelle

Tags und Links