/// <summary> /// Callled at runtime. /// </summary> /// <param name="services">collection service.</param> public virtual void ConfigureServices(IServiceCollection services) { services.AddCorrelate(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = $"{this.ServiceName} API", Version = "v1" }); c.CustomSchemaIds(x => x.FullName); }); services.AddCloudFoundryActuators(this.Configuration, MediaTypeVersion.V2, ActuatorContext.ActuatorAndCloudFoundry); services.AddControllers().ConfigureApiBehaviorOptions(options => { options.InvalidModelStateResponseFactory = context => { var appException = new ApplicationException(context.ModelState.Values.SelectMany(v => v.Errors) .Select(modelError => new ErrorDetail(StatusCodes.Status400BadRequest.ToString(CultureInfo.InvariantCulture), modelError.ErrorMessage)) .ToList()) { StatusCode = StatusCodes.Status400BadRequest.ToString(CultureInfo.InvariantCulture) }; var response = new ObjectResult(new { appException.Id, appException.Errors, appException.StatusCode }); response.StatusCode = StatusCodes.Status400BadRequest; return(response); }; }); var transientPolicySettings = new TransientPolicySettings(Configuration); services.AddSingleton(transientPolicySettings); services.RegisterInstace <IHttpRestClient, HttpRestClient>(transientPolicySettings); services.AddHealthChecks(); services.AddCors(); this.ConfigureComponentServices(services); }
/// <summary> /// get called by the middleware pipeline. /// </summary> /// <param name="httpContext">http context object.</param> /// <returns>A <see cref="Task"/> representing the result of the asynchronous operation.</returns> public async Task Invoke(HttpContext httpContext) { try { await next(httpContext); // calling next middleware } catch (ApplicationException ex) { if (ex is ValidationException) { httpContext.Response.StatusCode = StatusCodes.Status400BadRequest; } else { if (Enum.TryParse <HttpStatusCode>(ex.StatusCode, true, out HttpStatusCode httpStatusCode)) { httpContext.Response.StatusCode = (int)httpStatusCode; } else { httpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; } } ex.StatusCode = httpContext.Response.StatusCode.ToString(CultureInfo.InvariantCulture); await httpContext.Response.WriteAsync(CreateErrorResponse(ex, httpContext)); } catch (Exception ex) { var appException = new ApplicationException() .AddExceptionDetail(new ErrorDetail(StatusCodes.Status500InternalServerError.ToString(CultureInfo.InvariantCulture), "Something is broken.")); this.logger.LogError("Error::{@Id}::{@ex}", appException.Id, ex); httpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; await httpContext.Response.WriteAsync(CreateErrorResponse(appException, httpContext)); } }
/// <summary> /// Create Json error response. /// </summary> /// <param name="appException">Application exception.</param> /// <returns>json string.</returns> private string CreateErrorResponse(ApplicationException appException, HttpContext httpContext) { appException.StatusCode = httpContext.Response.StatusCode.ToString(CultureInfo.InvariantCulture); return(JsonConvert.SerializeObject(new { appException.Id, appException.Errors, appException.StatusCode })); }