コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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));
            }
        }
コード例 #3
0
 /// <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 }));
 }