public async Task <ActionResult> VoiceCall(string userId, int callId) { var response = new VoiceResponse(); var call = await _callsService.GetCallByIdAsync(callId); call = await _callsService.PopulateCallData(call, true, true, true, true, true, true, true); if (call == null) { response.Say("This call has been closed. Goodbye.").Hangup(); //return Request.CreateResponse(HttpStatusCode.OK, response.Element, new XmlMediaTypeFormatter()); return(Ok(new StringContent(response.ToString(), Encoding.UTF8, "application/xml"))); } if (call.State == (int)CallStates.Cancelled || call.State == (int)CallStates.Closed || call.IsDeleted) { response.Say(string.Format("This call, Id {0} has been closed. Goodbye.", call.Number)).Hangup(); //return Request.CreateResponse(HttpStatusCode.OK, response.Element, new XmlMediaTypeFormatter()); return(Ok(new StringContent(response.ToString(), Encoding.UTF8, "application/xml"))); } var stations = await _departmentGroupsService.GetAllStationGroupsForDepartmentAsync(call.DepartmentId); if (call.Attachments != null && call.Attachments.Count(x => x.CallAttachmentType == (int)CallAttachmentTypes.DispatchAudio) > 0) { var audio = call.Attachments.FirstOrDefault(x => x.CallAttachmentType == (int)CallAttachmentTypes.DispatchAudio); if (audio != null) { var url = await _callsService.GetShortenedAudioUrlAsync(call.CallId, audio.CallAttachmentId); Play playResponse = new Play(); playResponse.Url = new Uri(url); Gather gatherResponse1 = new Gather(); gatherResponse1.NumDigits = 1; gatherResponse1.Timeout = 10; gatherResponse1.Method = "GET"; gatherResponse1.Action = new Uri(string.Format("{0}/Twilio/VoiceCallAction/{1}/{2}", Config.SystemBehaviorConfig.ResgridApiBaseUrl, userId, callId)); StringBuilder sb1 = new StringBuilder(); sb1.Append("Press 0 to repeat, Press 1 to respond to the scene"); for (int i = 0; i < stations.Count; i++) { if (i >= 8) { break; } sb1.Append(string.Format(", press {0} to respond to {1}", i + 2, stations[i].Name)); } response.Play(playResponse).Say(sb1.ToString()).Gather(gatherResponse1).Pause(10).Hangup(); return(new ContentResult { Content = response.ToString(), ContentType = "application/xml", StatusCode = 200 }); } } string address = call.Address; if (String.IsNullOrWhiteSpace(address) && !string.IsNullOrWhiteSpace(call.GeoLocationData)) { try { string[] points = call.GeoLocationData.Split(char.Parse(",")); if (points != null && points.Length == 2) { address = await _geoLocationProvider.GetAproxAddressFromLatLong(double.Parse(points[0]), double.Parse(points[1])); } } catch { } } if (String.IsNullOrWhiteSpace(address) && !String.IsNullOrWhiteSpace(call.Address)) { address = call.Address; } StringBuilder sb = new StringBuilder(); if (!String.IsNullOrWhiteSpace(address)) { sb.Append(string.Format("{0}, Priority {1} Address {2} Nature {3}", call.Name, call.GetPriorityText(), call.Address, call.NatureOfCall)); } else { sb.Append(string.Format("{0}, Priority {1} Nature {2}", call.Name, call.GetPriorityText(), call.NatureOfCall)); } sb.Append(", Press 0 to repeat, Press 1 to respond to the scene"); for (int i = 0; i < stations.Count; i++) { if (i >= 8) { break; } sb.Append(string.Format(", press {0} to respond to {1}", i + 2, stations[i].Name)); } Gather gatherResponse = new Gather(); gatherResponse.NumDigits = 1; gatherResponse.Timeout = 10; gatherResponse.Method = "GET"; gatherResponse.Action = new Uri(string.Format("{0}/Twilio/VoiceCallAction/{1}/{2}", Config.SystemBehaviorConfig.ResgridApiBaseUrl, userId, callId)); response.Gather(gatherResponse).Say(sb.ToString()).Pause(10).Hangup(); return(new ContentResult { Content = response.ToString(), ContentType = "application/xml", StatusCode = 200 }); }