解决System.AggregateException问题

时间:2016-08-29 18:11:57

标签: c#-4.0 visual-studio-2015 asp.net-core asp.net-web-api2 iis-express

我需要另外一双眼睛来看看这个。这让我疯了。

我间歇性地得到了一个' System.AggregateException'运行连接到Web api的控制台应用程序时。

我是通过visual studio(IIS Express)在本地测试环境中执行此操作。

如上所述,我在IIS Express上有两个不同的应用程序本地运行(2个不同的端口)。一个是控制台应用程序,另一个是web api。控制台应用程序连接到web api。

如果它有效,它大概是50/50。 50%的时间它工作正常并吐出预期的结果。但另外50%的时间,它失败了,下面的错误。当它失败时,它始终是立即的,比如在启动控制台应用程序后2或3秒。

经过一些谷歌搜索和摆弄各种设置,我知道它不是这些之一: 不是超时问题 不是防火墙问题

我已尝试在不同的点设置断点,但它从未真正揭示任何重要的事情。

失败时得到的例外是:

类型' System.AggregateException'的例外情况发生在mscorlib.dll中但未在用户代码中处理

这是内部异常: 无法建立连接,因为目标计算机主动拒绝了它http://localhost:45321

堆栈跟踪表明:

at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult,TransportContext& context)    在System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)    在System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)    在System.Threading.Tasks.Task 1.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);
    }

}

}

这是web 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只是一个简单的辅助方法,可以处理节拍并吐出一个字符串。

1 个答案:

答案 0 :(得分:1)

要了解什么是异常,您必须捕获聚合异常并将它们像

一样展平

Intel Xeon E5