![](/img/trans.png)
[英]HttpClient.PostAsJsonAsync throws TaskCanceledException
[英]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)。
我想知道發布數據的大小是否有問題,但我沒有找到任何說明大小限制的文檔。
所以我的問題是:
一個可能的問題,你只是不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()
調用。 在您的情況下,可能需要不同的東西
請看一下這個問題,列舉一些你需要處理的異常:
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);
}
您可以在此問題的答案中找到更多詳細信息:
一旦你點擊等待控制將返回到Post的調用者。
不要在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.