SkyeBoniwell
SkyeBoniwell

Reputation: 7122

trouble shooting System.AggregateException

I need another pair of eyes to take a look at this. It's driving me nuts.

I am intermittently getting a 'System.AggregateException' when running a console app that connects to a web api.

I am doing this in a local testing environment through visual studio(IIS Express).

As stated, I have two different apps running locally on IIS Express(2 different ports). One is a console app and the other is a web api. The console app connects to the web api.

It's about 50/50 if it works or not. 50% of the time it works fine and spits out the expected results. But the other 50% of the time, it fails with the errors below. When it does fail, it's always immediate, like 2 or 3 seconds after starting the console app.

After some Googling and fiddling around with various settings, I know it's not either of these: not a timeout issue not a firewall issue

I've tried setting breakpoints at various points, but it never really reveals anything significant.

The exception I get when it fails is:

An exception of type 'System.AggregateException' occurred in mscorlib.dll but was not handled in user code

Here is the inner exception: No connection could be made because the target machine actively refused it http://localhost:45321

The stack trace indicates:

at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context) at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task1.get_Result() at BeatGenerator.BeatGeneratorMain.<>c.b__2_0(Task1 postTask) in C:\Users\xxx\Documents\VS2012\DrumBeats\BeatGenerator\BeatGeneratorMain.cs:line 72 at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke() at System.Threading.Tasks.Task.Execute()

Here is the error line:

 var response = await http.PostAsJsonAsync("http://localhost:45321/api/drumcorp/beats/generate", drumbeat)
                .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode()); 

This is the console app that connects to API controller:

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);
    }

}

}

This is the relevant section of the web api controller app:

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 is just a simple helper method that processes the beats and spits out a string.

Upvotes: 1

Views: 4067

Answers (1)

lazy
lazy

Reputation: 531

To understand what is the exception you will have to catch the aggregate exception and throw them flattened like

try { // Your code } catch (AggregateException agg) { throw agg.Flatten(); }

Upvotes: 1

Related Questions