gpt4 book ai didi

c# - 我可以使用启动期间配置的 MvcJsonOptions 在自定义中间件中进行序列化吗?

转载 作者:行者123 更新时间:2023-11-30 16:38:21 25 4
gpt4 key购买 nike

我正在构建一个带有用于全局异常处理的中间件的 ASP.NET Core Api。在 Startup 类中,我配置了一些用于所有 Controller 的 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);
}
}

问题是:有没有办法在我的自定义中间件中使用 Controller 中使用的相同 JSON 序列化程序?我想避免在两个不同的地方设置相同的配置。

最佳答案

JsonConvert.SerializeObject 有一个 overload that also takes an instance of JsonSerializerSettings ,它可以与选项模式和依赖注入(inject)相结合。总而言之,这看起来像这样:

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);
...
}
}

在此示例中,我们将注入(inject)已配置的 MvcJsonOptions 实例,然后将其 SerializerSettings 值传递给 JsonConvert.SerializeObject

关于c# - 我可以使用启动期间配置的 MvcJsonOptions 在自定义中间件中进行序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55305179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com