예제 #1
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors();

            services.AddDataServices(Configuration);
            services.AddProfiles(typeof(Startup));

            services.AddControllers();

            services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
            .AddMvcOptions(options =>
            {
                // options.EnableEndpointRouting = false;
                options.Filters.Add(new HttpResponseExceptionFilter());
                //options.Conventions.Add(new RouteTokenTransformerConvention(new SnakeCaseParameterTransformer()));
            })
            .ConfigureApiBehaviorOptions(options =>
            {
                options.InvalidModelStateResponseFactory = context =>
                {
                    HttpResponseError response = new HttpResponseError(status: HttpStatusCode.BadRequest, modelState: context.ModelState);
                    return(new BadRequestObjectResult(response));
                };
            })
            .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.ContractResolver = new DefaultContractResolver()
                {
                    NamingStrategy = new SnakeCaseNamingStrategy()
                };
            });
        }
        public async Task Invoke(HttpContext context)
        {
            HttpResponseError response = null;

            try
            {
                await _next.Invoke(context);

                response = new HttpResponseError(status: (HttpStatusCode)context.Response.StatusCode);
            }
            catch (HttpResponseException ex)
            {
                response = new HttpResponseError(status: ex.StatusCode, message: ex.Message);
                if (_environment.IsDevelopment())
                {
                    response.Error = ex.Error;
                    response.Trace = ex.StackTrace;
                }

                Console.WriteLine($"HttpResponseException endpoint {context.Request.Method}:{context.Request.Path.Value} {response.Error} {response.Trace}");
            }
            catch (Exception ex)
            {
                response = new HttpResponseError(status: HttpStatusCode.InternalServerError, message: ex.Message);
                if (_environment.IsDevelopment())
                {
                    response.Trace = ex.StackTrace;
                }

                Console.WriteLine($"Exception endpoint {context.Request.Method}:{context.Request.Path} {response.Error} {response.Trace}");
            }
            finally
            {
                if (!context.Response.HasStarted && response != null && response.StatusCode != HttpStatusCode.NoContent)
                {
                    context.Response.ContentType = "application/json";
                    context.Response.StatusCode  = response.StatusCode.GetValue();

                    string jsonResponse = JsonConvert.SerializeObject(response, new JsonSerializerSettings
                    {
                        ContractResolver = new DefaultContractResolver()
                        {
                            NamingStrategy = new SnakeCaseNamingStrategy()
                        }
                    });

                    await context.Response.WriteAsync(jsonResponse);
                }
            }
        }