簡體   English   中英

HttpClient.PostAsJsonAsync崩潰而不拋出異常

[英]HttpClient.PostAsJsonAsync crashing without throwing exception

我有一個帶有WebAPI控制器的ASP.NET MVC應用程序,以及一個使用這些控制器的控制台應用程序。 控制台應用程序從計划任務運行,從遠程源獲取數據,解析它,並在退出之前將其發布到MVC應用程序。

這適用於幾個控制器,但其中一個調用會使控制台應用程序崩潰而不會拋出異常。 用於所有控制器的調用者代碼:

    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控制器。

程序共享通過API調用傳遞的T的相同代碼。

從輸出窗口:

程序'[9640] ProgramName.vshost.exe:Managed(v4.0.30319)'已退出,代碼為0(0x0)。

我想知道發布數據的大小是否有問題,但我沒有找到任何說明大小限制的文檔。

所以我的問題是:

  1. 什么可能導致控制台應用程序提前退出?
  2. 如何檢測到這一點並阻止程序退出?

一個可能的問題,你只是不await Post方法的執行。 這是我所說的簡化版本:

    static void Main(string[] args)
    {
        Action testAction = async () =>
        {
            Console.WriteLine("In");
            await Task.Delay(100);
            Console.WriteLine("First delay");
            await Task.Delay(100);
            Console.WriteLine("Second delay");
        };
        testAction.Invoke();
        Thread.Sleep(150);
    }

testAction將在第二個await Task中止,並且控制台以0代碼退出。 輸出將是:

   In
   First delay
   Press any key to continue . . .

在我的情況下,我只會在Main方法的末尾添加Console.ReadKey()調用。 在您的情況下,可能需要不同的東西

請看一下這個問題,列舉一些你需要處理的異常:

控制台應用程序中的.NET Global異常處理程

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. 一旦你點擊等待控制將返回到Post的調用者。

  2. 不要在post方法中等待,而是從返回的任務中使用ContinueWith,例如: UI線程上的任務繼續或等待返回的任務: http//msdn.microsoft.com/en-gb/library/dd537610.aspx

我建議測試一下JSON.Net序列化程序是否能夠序列化你的類型。

“退出代碼0”表示程序正常退出。 因此,它可能是Post<T>的調用者,甚至上面的調用者確定是時候結束該程序了。 如果您熟悉調試工具(如WinDbg),則可以在ntdll函數中設置本機斷點以進一步診斷案例,但通常只需要查看代碼庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM