故障排除 System.AggregateException
trouble shooting System.AggregateException
我需要另一双眼睛来看看这个。快把我逼疯了。
当 运行 连接到 Web api 的控制台应用程序时,我间歇性地收到 'System.AggregateException'。
我正在通过 visual studio(IIS Express) 在本地测试环境中执行此操作。
如前所述,我在 IIS Express(2 个不同的端口)上本地有两个不同的应用程序 运行。一个是控制台应用程序,另一个是 Web api。控制台应用程序连接到网络 api.
有效与否大约是50/50。 50% 的时间它工作正常并吐出预期的结果。但另外 50% 的时间,它会失败并出现以下错误。当它确实失败时,它总是立即发生,比如在启动控制台应用程序后 2 或 3 秒。
在谷歌搜索和摆弄各种设置后,我知道它不是以下任何一个:
不是超时问题
不是防火墙问题
我试过在不同的点设置断点,但它从来没有真正揭示任何重要的东西。
失败时得到的异常是:
'System.AggregateException' 类型的异常发生在 mscorlib.dll 但未在用户代码中处理
这是内部异常:
由于目标机器主动拒绝,无法建立连接http://localhost:45321
堆栈跟踪表明:
在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult,TransportContext& 上下文)
在 System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
在 System.Threading.Tasks.Task.ThrowIfExceptional(布尔值 includeTaskCanceledExceptions)
在 System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task
1.get_Result()
在 BeatGenerator.BeatGeneratorMain.<>c.b__2_0(任务1 postTask) in C:\Users\xxx\Documents\VS2012\DrumBeats\BeatGenerator\BeatGeneratorMain.cs:line 72
at System.Threading.Tasks.ContinuationResultTaskFromResultTask
2.InnerInvoke()
在 System.Threading.Tasks.Task.Execute()
这是错误行:
var response = await http.PostAsJsonAsync("http://localhost:45321/api/drumcorp/beats/generate", drumbeat)
.ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode());
这是连接到 API 控制器的控制台应用程序:
public class DrumBeats
{
public int StartBeat { get; set; }
public int EndBeat { get; set; }
public int ChordId { get; set; }
}
public class BeatGeneratorMain
{
static void Main(string[] args)
{
Generate().Wait();
}
private static async Task Generate()
{
var drumbeat = new DrumBeats();
drumbeat.ChordId = 122;
drumbeat.StartBeat = 2;
drumbeat.EndBeat = 4;
var creds = new NetworkCredential("testUser", "xxxx", "xxx"); //username, pw, domain
var handler = new HttpClientHandler { Credentials = creds };
using (var http = new HttpClient(handler))
{
http.Timeout = TimeSpan.FromMinutes(10);
var response = await http.PostAsJsonAsync("http://localhost:45321/api/drumcorp/beats/generate", drumbeat)
.ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode());
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
}
这是网络的相关部分 api 控制器应用程序:
public class DrumBeats //same as in console app
{
public int StartBeat { get; set; }
public int EndBeat { get; set; }
public int ChordId { get; set; }
}
[HttpPost("api/drumcorp/beats/generate")]
public string PostMethodBeats([FromBody] DrumBeats drumbeat)
{
string beatsChart = DrumBeatMaster.ReturnBeatsChart(DrumBeats.ChordId, DrumBeats.StartBeat, DrumBeats.EndBeat);
var mesg = "<b>Beats Created</b><br /><br /> ";
return mesg + beatsChart;
}
DrumBeatMaster.ReturnBeatsChart只是一个处理节拍并吐出字符串的简单辅助方法。
要了解什么是异常,您必须捕获聚合异常并将它们像
一样扁平化抛出
try
{
// Your code
}
catch (AggregateException agg)
{
throw agg.Flatten();
}
我需要另一双眼睛来看看这个。快把我逼疯了。
当 运行 连接到 Web api 的控制台应用程序时,我间歇性地收到 'System.AggregateException'。
我正在通过 visual studio(IIS Express) 在本地测试环境中执行此操作。
如前所述,我在 IIS Express(2 个不同的端口)上本地有两个不同的应用程序 运行。一个是控制台应用程序,另一个是 Web api。控制台应用程序连接到网络 api.
有效与否大约是50/50。 50% 的时间它工作正常并吐出预期的结果。但另外 50% 的时间,它会失败并出现以下错误。当它确实失败时,它总是立即发生,比如在启动控制台应用程序后 2 或 3 秒。
在谷歌搜索和摆弄各种设置后,我知道它不是以下任何一个: 不是超时问题 不是防火墙问题
我试过在不同的点设置断点,但它从来没有真正揭示任何重要的东西。
失败时得到的异常是:
'System.AggregateException' 类型的异常发生在 mscorlib.dll 但未在用户代码中处理
这是内部异常: 由于目标机器主动拒绝,无法建立连接http://localhost:45321
堆栈跟踪表明:
在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult,TransportContext& 上下文)
在 System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
在 System.Threading.Tasks.Task.ThrowIfExceptional(布尔值 includeTaskCanceledExceptions)
在 System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task
1.get_Result()
在 BeatGenerator.BeatGeneratorMain.<>c.b__2_0(任务1 postTask) in C:\Users\xxx\Documents\VS2012\DrumBeats\BeatGenerator\BeatGeneratorMain.cs:line 72
at System.Threading.Tasks.ContinuationResultTaskFromResultTask
2.InnerInvoke()
在 System.Threading.Tasks.Task.Execute()
这是错误行:
var response = await http.PostAsJsonAsync("http://localhost:45321/api/drumcorp/beats/generate", drumbeat)
.ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode());
这是连接到 API 控制器的控制台应用程序:
public class DrumBeats
{
public int StartBeat { get; set; }
public int EndBeat { get; set; }
public int ChordId { get; set; }
}
public class BeatGeneratorMain
{
static void Main(string[] args)
{
Generate().Wait();
}
private static async Task Generate()
{
var drumbeat = new DrumBeats();
drumbeat.ChordId = 122;
drumbeat.StartBeat = 2;
drumbeat.EndBeat = 4;
var creds = new NetworkCredential("testUser", "xxxx", "xxx"); //username, pw, domain
var handler = new HttpClientHandler { Credentials = creds };
using (var http = new HttpClient(handler))
{
http.Timeout = TimeSpan.FromMinutes(10);
var response = await http.PostAsJsonAsync("http://localhost:45321/api/drumcorp/beats/generate", drumbeat)
.ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode());
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
}
这是网络的相关部分 api 控制器应用程序:
public class DrumBeats //same as in console app
{
public int StartBeat { get; set; }
public int EndBeat { get; set; }
public int ChordId { get; set; }
}
[HttpPost("api/drumcorp/beats/generate")]
public string PostMethodBeats([FromBody] DrumBeats drumbeat)
{
string beatsChart = DrumBeatMaster.ReturnBeatsChart(DrumBeats.ChordId, DrumBeats.StartBeat, DrumBeats.EndBeat);
var mesg = "<b>Beats Created</b><br /><br /> ";
return mesg + beatsChart;
}
DrumBeatMaster.ReturnBeatsChart只是一个处理节拍并吐出字符串的简单辅助方法。
要了解什么是异常,您必须捕获聚合异常并将它们像
一样扁平化抛出try
{
// Your code
}
catch (AggregateException agg)
{
throw agg.Flatten();
}