public Task OnAuthorizationAsync(AuthorizationFilterContext context) { _logger.LogInformation("Authorize request header"); var correlationHeader = context.HttpContext.Request.Headers[Identifiers.CorrelationId]; //TODO:replace the following correlation id, since it's correlating all operation from this assembly instance. var correlationId = _operationalUnit.InstanceId; if (!string.IsNullOrEmpty(correlationHeader) && Guid.TryParse(correlationHeader, out Guid paresedCorId)) { correlationId = paresedCorId; } //TODO: remove bypassing authorization if (false && string.IsNullOrEmpty(context.HttpContext.Request.Headers["authorization"])) { var messageHeader = new MessageHeader { CorrelationId = correlationId }; var messageFooter = new MessageFooter { Sender = context.ActionDescriptor.DisplayName, Environment = _operationalUnit.Environment, Assembly = _operationalUnit.Assembly, FingerPrint = context.ActionDescriptor.Id, Route = JsonConvert.SerializeObject(context.RouteData.Values.ToDictionary(key => key.Key, value => value.Value?.ToString()), Defaults.JsonSerializerSettings), Hint = Enum.GetName(typeof(ResponseHint), ResponseHint.UnAuthorized) }; messageHeader.GetType().GetProperties() .ToList().ForEach(prop => { context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageHeader)?.ToString())); }); messageFooter.GetType().GetProperties() .ToList().ForEach(prop => { context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageFooter)?.ToString())); }); context.Result = new ContentResult() { StatusCode = context.HttpContext.Response.StatusCode, ContentType = Identifiers.ApplicationJson, Content = JsonConvert.SerializeObject(Enum.GetName(typeof(ResponseHint), ResponseHint.UnAuthorized), Defaults.JsonSerializerSettings) }; _logger.LogInformation("Override response!"); return(Task.CompletedTask); } return(Task.CompletedTask); }
public Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { var correlationHeader = context.HttpContext.Request.Headers[Identifiers.CorrelationId]; //TODO:replace the following correlation id, since it's correlating all operation from this assembly instance. var correlationId = _operationalUnit.InstanceId; if (!string.IsNullOrEmpty(correlationHeader) && Guid.TryParse(correlationHeader, out Guid paresedCorId)) { correlationId = paresedCorId; } var messageHeader = new MessageHeader(isSucceed: context.HttpContext.Response.StatusCode == 200) { CorrelationId = correlationId }; var messageFooter = new MessageFooter { Sender = context.ActionDescriptor.DisplayName, Environment = _operationalUnit.Environment, Assembly = _operationalUnit.Assembly, FingerPrint = context.ActionDescriptor.Id, Route = JsonConvert.SerializeObject(context.RouteData.Values.ToDictionary(key => key.Key, value => value.Value?.ToString()), Defaults.JsonSerializerSettings), Hint = Enum.GetName(typeof(ResponseHint), ResponseHint.OK) //TODO: infer the hint from HTTP status code }; messageHeader.GetType().GetProperties() .ToList().ForEach(prop => { context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageHeader)?.ToString())); }); messageFooter.GetType().GetProperties() .ToList().ForEach(prop => { context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageFooter)?.ToString())); }); context.Result = new ContentResult() { StatusCode = context.HttpContext.Response.StatusCode, ContentType = Identifiers.ApplicationJson, Content = JsonConvert.SerializeObject(getContentResult(context.Result), Defaults.JsonSerializerSettings) }; _logger.LogInformation("Override response!"); return(next.Invoke()); object getContentResult(IActionResult result) { switch (result) { case ContentResult CntR: { return(CntR?.Content); } case ObjectResult ObjR: { return(ObjR?.Value); } case JsonResult JsonR: { return(JsonR?.Value); } default: { return(result); } } }; }
void OnServerMessage(object sender, MessageHeader msghdr) { Log.Debug($"OnServerMessage() type:{msghdr.GetType().Name}"); }
public Task OnExceptionAsync(ExceptionContext context) { _logger.LogCritical(context.Exception, context.Exception.Message); var correlationHeader = context.HttpContext.Request.Headers[Identifiers.CorrelationId]; //TODO:replace the following correlation id, since it's correlating all operation from this assembly instance. var correlationId = _operationalUnit.InstanceId; if (!string.IsNullOrEmpty(correlationHeader) && Guid.TryParse(correlationHeader, out Guid paresedCorId)) { correlationId = paresedCorId; } var exception = context.Exception; (int code, string message, ResponseHint responseHint) = (exception is CustomException ex) ? ex.CustomMessage : (exception.HResult, exception.Message, ResponseHint.SystemError); var messageHeader = new MessageHeader(isSucceed: false) { CorrelationId = correlationId }; var messageFooter = new MessageFooter { Sender = context.ActionDescriptor.DisplayName, Environment = _operationalUnit.Environment, Assembly = _operationalUnit.Assembly, FingerPrint = context.ActionDescriptor.Id, Route = JsonConvert.SerializeObject(context.RouteData.Values.ToDictionary(key => key.Key, value => value.Value?.ToString()), Defaults.JsonSerializerSettings), Hint = Enum.GetName(typeof(ResponseHint), responseHint) }; context.ExceptionHandled = true; messageHeader.GetType().GetProperties() .ToList().ForEach(prop => { context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageHeader)?.ToString())); }); messageFooter.GetType().GetProperties() .ToList().ForEach(prop => { context.HttpContext.Response.Headers.Add(prop.Name, new StringValues(prop.GetValue(messageFooter)?.ToString())); }); context.Result = new ContentResult() { StatusCode = StatusCodes.Status500InternalServerError, ContentType = Identifiers.ApplicationJson, Content = JsonConvert.SerializeObject(closureGenerateErrorMessage(), Defaults.JsonSerializerSettings) }; _logger.LogInformation("Override response!"); return(Task.CompletedTask); object closureGenerateErrorMessage() { return(new { //TODO: system message only should share user friendly messages for system messages, as well to not break system security. code, message, systemMessage = exception.Message }); } }