Могу ли я использовать MvcJsonOptions, настроенные во время запуска, для сериализации в пользовательском промежуточном программном обеспечении? - PullRequest
1 голос
/ 22 марта 2019

Я создаю ASP.NET Core Api с промежуточным программным обеспечением для глобальной обработки исключений. В классе Startup я настроил некоторые параметры JSON, которые должны использоваться для всех контроллеров.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddJsonOptions(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver()
            {
                NamingStrategy = new SnakeCaseNamingStrategy()
            };
            options.SerializerSettings.Converters.Add(new StringEnumConverter());
        });
}

Затем я создал специальное промежуточное программное обеспечение для обработки исключений. Промежуточное программное обеспечение должно регистрировать ошибку и возвращать ответ об ошибке как JSON. Проблема в том, что глобальный Newtonsoft JsonConvert не использует параметры, которые указываются во время инициализации Mvc (довольно очевидно).

Код промежуточного программного обеспечения обработчика ошибок:

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context, ILogger<ErrorHandlingMiddleware> logger)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex, logger);
        }
    }

    private Task HandleExceptionAsync(HttpContext context, Exception ex, ILogger logger)
    {
        var errorResponse = new ErrorResponse { Message = ex.Message };
        logger.LogError(ex, errorResponse.Message);

        var result = JsonConvert.SerializeObject(errorResponse);
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = 500;
        return context.Response.WriteAsync(result);
    }
}

Вопрос : есть ли способ использовать тот же сериализатор JSON, который используется в контроллерах, в моем специальном промежуточном программном обеспечении? Я хотел бы избежать настройки одной и той же конфигурации в двух разных местах.

1 Ответ

1 голос
/ 22 марта 2019

JsonConvert.SerializeObject имеет перегрузку , которая также принимает экземпляр JsonSerializerSettings, который можно комбинировать с шаблоном параметров и внедрением зависимости. В целом, это будет выглядеть примерно так:

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly JsonSerializerSettings _jsonSerializerSettings;

    public ErrorHandlingMiddleware(RequestDelegate next, IOptions<MvcJsonOptions> mvcJsonOptions)
    {
        _next = next;
        _jsonSerializerSettings = mvcJsonOptions.Value.SerializerSettings;
    }

    ...

    private Task HandleExceptionAsync(HttpContext context, Exception ex, ILogger logger)
    {
        ...
        var result = JsonConvert.SerializeObject(errorResponse, _jsonSerializerSettings);
        ...
    }
}

В этом примере мы внедряем настроенный экземпляр MvcJsonOptions и затем передаем его значение SerializerSettings в JsonConvert.SerializeObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...