11

WebAPI コントローラーを備えた ASP.NET MVC アプリと、これらのコントローラーを使用するコンソール アプリがあります。コンソール アプリは、スケジュールされたタスクから実行され、リモート ソースからデータを取得して解析し、終了する前に MVC アプリに投稿します。

これはいくつかのコントローラーでうまく機能しますが、呼び出しの 1 つが例外をスローせずにコンソール アプリをクラッシュさせています。すべてのコントローラーに使用される呼び出し元コード:

    public async Task<string> Post<T>(string urlRoot, string url, T data)
    {
        var result = "";
        try
        {
            var httpClient = GetHttpClient(urlRoot);
            var response = await httpClient.PostAsJsonAsync(url, data); // Exits here
            if (response.IsSuccessStatusCode)
            {
                result = await response.Content.ReadAsAsync<string>();
            }
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
        }
        return result;
    }

を呼び出すと、プログラムは終了しますawait httpClient.PostAsJsonAsync(url, data)。ブレークポイントを使用すると、catchブロックにもifステートメントにも到達しません。ただし、Web API コントローラーが正しいデータで呼び出されているため、呼び出しは行われています。

Tプログラムは、API 呼び出しで渡される同じコードを共有します。

出力ウィンドウから:

プログラム '[9640] ProgramName.vshost.exe: Managed (v4.0.30319)' はコード 0 (0x0) で終了しました。

投稿されたデータのサイズが問題になるのではないかと思っていましたが、サイズ制限を記載したドキュメントは見つかりませんでした。

だから私の質問は:

  1. コンソール アプリが途中で終了する原因は何ですか?
  2. これを検出してプログラムが終了しないようにするにはどうすればよいですか?
4

5 に答える 5

1

この質問を見てください魔女は、あなたが処理する必要があるいくつかの例外を列挙します:

コンソール アプリケーションの .NET グローバル例外ハンドラ

Application.ThreadException += MYThreadHandler;

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

タスクの例外については、次のアプローチも検討してください。

static void Main(string[] args)
{
    Task<int> task = new Task<int>(Test);
    task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
    task.Start();
    Console.ReadLine();
}

static int Test()
{
    throw new Exception();
}

static void ExceptionHandler(Task<int> task)
{
    var exception = task.Exception;
    Console.WriteLine(exception);
}

詳細については、この質問の回答の 1 つを参照してください。

別のスレッドでスローされた例外をキャッチする

于 2014-04-29T18:40:52.660 に答える
0
  1. await コントロールを押すと、Post の呼び出し元に返されます。

  2. post メソッドで待機するのではなく、返されたタスクから ContinueWith を使用します。たとえば、UI スレッドでのタスクの継続または返されたタスクでの待機: http://msdn.microsoft.com/en-gb/library/dd537610.aspx

于 2013-04-16T12:35:58.817 に答える
0

JSON.Net シリアライザーが型をシリアライズできるかどうかをテストすることをお勧めします。

于 2013-04-16T14:15:02.917 に答える