public async Task <IActionResult> Action() { try { string json = string.Empty; if (Request.HasFormContentType) { var jObject = new JObject(); foreach (var item in Request.Form) { jObject.Add(item.Key, new JValue(item.Value)); } json = JsonConvert.SerializeObject(jObject); } else { var stream = new StreamReader(HttpContext.Request.Body); json = await stream.ReadToEndAsync(); } var url = (string)HttpContext.GetRouteValue("url"); var apiClientRegistration = _apiClientRegistrations.FirstOrDefault(p => p.Route == url); if (apiClientRegistration == null) { return(NotFound()); } var request = JsonConvert.DeserializeObject(json, apiClientRegistration.Type); if (typeof(Command).IsAssignableFrom(apiClientRegistration.Type)) { var command = request as Command; command.RequestedBy = HttpContext.User.Claims.FirstOrDefault(p => p.Type == "sub")?.Value; if (Request.HasFormContentType) { if (Request.Form.Files != null) { return(Ok(_commandService.ExecuteCommandWithAttachments((Command)request, Request.Form.Files.Select(p => new Attachment { FileStream = p.OpenReadStream(), Name = p.Name }).ToList()))); } } return(Ok(_commandService.ExecuteCommand((Command)request))); } if (apiClientRegistration.Type.IsSubClassOfGeneric(typeof(QueryRequest <>))) { var responseType = apiClientRegistration.Type.BaseType?.GetGenericArguments()[0]; var method = _queryService.GetType().GetMethod("ExecuteQuery"); var generic = method.MakeGenericMethod(apiClientRegistration.Type, responseType); var query = (dynamic)request; query.RequestedBy = HttpContext.User.Claims.FirstOrDefault(p => p.Type == "sub")?.Value; var result = generic.Invoke(_queryService, new[] { request }); return(Ok(result)); } return(NotFound()); } catch (Exception e) { _logger.Error(e, ""); return(StatusCode(500)); } }