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:
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:
testAction
wird beim zweiten Warten-Task abgebrochen, und die Konsole wird mit 0 beendet. Und die Ausgabe wird sein:
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
Sobald Sie auf "hit" tippen, wird die Kontrolle an den Aufrufer von Post zurückgegeben.
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: Ссылка
Ich würde vorschlagen zu testen, ob der JSON.Net Serializer in der Lage ist, Ihren Typ zu serialisieren.
"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.
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
Tags und Links asp.net-web-api c#