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