/// <summary>
        /// Writes <see cref="ProblemDetails"/> to response body.
        /// </summary>
        public async Task WriteAsync(ProblemResponseWriterContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var response = context.HttpContext.Response;

            if (response.HasStarted)
            {
                throw new InvalidOperationException("Response has started.");
            }

            var problem = context.Problem;

            response.StatusCode  = problem.Status ?? StatusCodes.Status500InternalServerError;
            response.ContentType = "application/problem+json; charset=utf-8";

            context.ApplyTo(response);
            await response.StartAsync();

            var bodyStream = response.Body;
            await JsonSerializer.SerializeAsync(bodyStream, problem, problem.GetType(), SerializerOptions);

            await bodyStream.FlushAsync();
        }
        /// <summary>
        /// Writes <see cref="ProblemDetails"/> to response body.
        /// </summary>
        public Task WriteAsync(ProblemResponseWriterContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (context.ActionContext == null)
            {
                throw new InvalidOperationException("Action context is required.");
            }

            var executor = context.HttpContext.RequestServices
                           .GetRequiredService <IActionResultExecutor <ObjectResult> >();
            var result = new ObjectResult(context.Problem)
            {
                StatusCode = context.Problem.Status
            };

            return(executor.ExecuteAsync(context.ActionContext, result));
        }