static async Task <GetLoanOptionsResponsePayload> SendHttpRequest(GetLoanOptionsRequestPayload requestPayload) { var sw = new Stopwatch(); sw.Start(); var payload = JsonConvert.SerializeObject(requestPayload); logger.WriteOutput($"{requestPayload.Id:000} REQUEST: CreditScore = {requestPayload.CreditScore}"); var message = new HttpRequestMessage(HttpMethod.Post, ""); message.Headers.Add("Accept", "application/json"); message.Content = new StringContent(payload, System.Text.Encoding.UTF8, "application/json"); var response = await httpClient.SendAsync(message); var responsePayload = await response.Content.ReadAsStringAsync(); var options = Helpers.Deserialize <GetLoanOptionsResponsePayload>(responsePayload); sw.Stop(); SendOverHttp_AverageRTTms = (SendOverHttp_AverageRTTms * SendOverHttp_SendCount + sw.ElapsedMilliseconds) / (++SendOverHttp_SendCount); if (sw.ElapsedMilliseconds < SendOverHttp_MinRTTms || SendOverHttp_MinRTTms == 0) { SendOverHttp_MinRTTms = sw.ElapsedMilliseconds; } if (sw.ElapsedMilliseconds > SendOverHttp_MaxRTTms) { SendOverHttp_MaxRTTms = sw.ElapsedMilliseconds; } return(options); }
static async Task SendRequests(RequestResponseFactory factory) { // get number of requests to make var requestsToSend = GetNumberInActionArgs(0); var msDelayBetweenReqs = GetNumberInActionArgs(1); var httpEndpoint = GetActionArg(2); if (httpEndpoint != null) { SetupHttpClient(httpEndpoint); } var sender = factory.GetSender <GetLoanOptionsRequestPayload, GetLoanOptionsResponsePayload>(); sender.RequestSending += (r, m) => { logger.WriteOutput($"{r.Id:000} REQUEST: CreditScore = {r.CreditScore}, SessionId = {m.ReplyToSessionId}"); }; var random = new Random(); var outstandingRequests = new Task[requestsToSend]; logger.WriteOutput("Sending requests..."); for (var i = 0; i < requestsToSend; i++) { var payload = new GetLoanOptionsRequestPayload { Id = i, CreditScore = random.Next(300, 801) }; var rememberI = i; if (httpEndpoint == null) { outstandingRequests[i] = sender.SendRequest(payload).ContinueWith(async t => { if (t.IsFaulted) { foreach (var e in t.Exception.InnerExceptions) { logger.WriteOutput($"{rememberI:000} Failure: {e.Message}"); } return; } var response = await t; logger.WriteOutput($"{rememberI:000} RESPONSE: Provider = {response.Provider}, Loan = {response.LoanAmount}"); }); } else { outstandingRequests[i] = SendHttpRequest(payload).ContinueWith(async t => { var response = await t; logger.WriteOutput($"{rememberI:000} RESPONSE: Provider = {response.Provider}, Loan = {response.LoanAmount}"); }); } await Task.Delay(msDelayBetweenReqs); } await Task.WhenAll(outstandingRequests); logger.Stop(); if (httpEndpoint == null) { OutputAppMessage($"Average Round Trip Time (sec): {Math.Round(sender.AverageRTTms / 1000.0, 3)}"); OutputAppMessage($"Min Round Trip Time (sec): {Math.Round(sender.MinRTTms / 1000.0, 3)}"); OutputAppMessage($"Max Round Trip Time (sec): {Math.Round(sender.MaxRTTms / 1000.0, 3)}"); } else { OutputAppMessage($"Average Round Trip Time (sec): {Math.Round(SendOverHttp_AverageRTTms / 1000.0, 3)}"); OutputAppMessage($"Min Round Trip Time (sec): {Math.Round(SendOverHttp_MinRTTms / 1000.0, 3)}"); OutputAppMessage($"Max Round Trip Time (sec): {Math.Round(SendOverHttp_MaxRTTms / 1000.0, 3)}"); } }