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

2024-01-06

我正在构建一个带有用于全局异常处理的中间件的 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 序列化器?我想避免在两个不同的地方设置相同的配置。


JsonConvert.SerializeObject has an 也需要一个实例的重载JsonSerializerSettings https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonConvert_SerializeObject_5.htm,它可以与选项模式和依赖注入相结合。总而言之,这看起来像这样:

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用在启动期间配置的 MvcJsonOptions 在自定义中间件中进行序列化吗? 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当

随机推荐

  • mocha 和 ts-node 找不到本地 .d.ts 文件

    我有以下项目结构 typetests type test ts myproj d ts tsconfig json 我的 tsconfig json 看起来像这样 compilerOptions module commonjs module
  • Openslide-python 导入错误

    我在运行时收到以下错误import openslide从 python 终端内部 code Traceback most recent call last File code
  • 如何从 python 文件内部导入 Boost.Python

    我正在使用 Boost Python 将解释器嵌入到我的 C 可执行文件中并执行一些预先编写的脚本 我已经让它工作了 这样我就可以调用 python 文件中的函数 但是我想使用的 python 代码导入外部文件 并且这些导入失败 因为 没有
  • scanf()、std::cin 在多线程环境中的行为如何?

    我想用一个例子来说明我的问题 假设有一个数组N N gt gt 1 设置为运行此函数的线程 void Process Some thread safe processing which requires in deterministic c
  • Django - 网络商店模型组织

    我开始在 Django 中创建一个网上商店 它将有不同种类的产品 如衬衫 海报 杯子 贴纸 每种类型的产品都会有不同的领域 例如 衬衫有尺寸和颜色选项 贴纸有尺寸选项 海报和马克杯没有选项 做这个的最好方式是什么 遗产 关系 我仍在学习 D
  • 数据读取器跳过第一个结果

    我有一个相当复杂的 SQL 查询 它根据客户 ID 从数据库中提取不同类型的产品 它提取三种不同类型的产品 通过其唯一标识符编号范围进行标识 即 ID 1000 1999 是一种产品类型 2000 2999 是另一种产品类型 3000 39
  • Angular JS - 如何在 ng-repeat 中添加额外的 DIV

    我有一个数组a 1 2 3 4 5 6 Using ng repeat在这个数组上 我创建了 6 个divs 请参考这个plunker http plnkr co edit fe4nTUFQ9ojEyBsyrOtH p preview 有没
  • SQL 存档脚本

    我正在尝试将数据库中的表中的记录存档到存档数据库中的相同表 我需要能够对日期大于三年前的所有记录进行插入 然后删除这些行 然而 这个表有数百万条实时记录 所以我想在一次大约 100 到 1000 个块的循环中运行它 到目前为止 我的存储过程
  • 双三次插值如何工作?

    在阅读有关该主题的文本后 我发现它考虑了 16 个原始相邻像素 我想知道的是它如何计算新像素的颜色值 如果 16 个像素的颜色值已知 如何计算新像素的值 我认为这已经很好地解释了维基百科 http en wikipedia org wiki
  • 如何在 R 中为新函数绘制 CDF 和 PDF

    如何在 R 中绘制 CDF 和 PDF f lt function x 2 a b x 3 exp b x 2 a 范围从 0 到无穷大 我会使用这样的东西 因为我喜欢ggplot2 a lt 1 b lt 2 f lt function
  • Visual Studio 和 Unity 中使用 MDB 文件进行构建后事件

    我在 Unity 中的 MonoBehaviours 源代码不是 Assets 文件夹内的脚本 而是我作为插件添加的已编译 DLL 我在 Visual Studio 中为我的 C 项目添加了生成后事件 以尝试解决每次更改某些内容时都必须复制
  • Node.js 子进程——spawn 和 fork 之间的区别

    这似乎是一个基本问题 但我找不到任何文档 分叉和生成 Node js 进程有什么区别 我读过分叉是生成的一种特殊情况 但是使用它们每个的不同用例 重复是什么 Spawn 是一个旨在运行系统命令的命令 当您运行spawn时 您向其发送一个系统
  • 如何动态下载字体并将其安装到 iOS 应用程序

    客户希望通过 API 调用下载字体来动态地将字体添加到 iOS 应用程序中 这可能吗 我挖掘出的所有资源都展示了如何手动将 ttf 文件拖到 Xcode 并将其添加到 plist 中 是否可以下载字体并以编程方式在客户端上使用它 Thank
  • App Engine 实例中 /_ah/start 的日志

    我的 App Engine 实例中有一个映射到 url ah start 的 servlet 它似乎不起作用 我无法像处理所有其他请求那样从此 servlet 中找到日志记录信息 由于它应该作为单独的线程运行 因此我无法在自定义请求中手动测
  • 未能找到带有哈希字符串 android-23 的目标

    当尝试从 git github com osmdroid osmdroid 构建 OpenStreetMapView 时 出现以下错误 failed to find target with hash string android 23 D
  • 角度依赖注入导出函数

    我正在使用 apollo graphql 它有一个模块 里面有一个函数 export function createApollo httpLink HttpLink connectToDevTools true 在此函数内 您定义 grap
  • mysql n:m 关系:查找具有多个特定关系的行

    我有两个 SQL 表 产品 和 标签 它们具有 n m 关系 使用第三个表 product tags 我想使用查询来查找具有多个特定标签的每个产品 例如 查找与标签 1 23 和 54 相关的所有产品 有没有办法只用一个查询来做到这一点 您
  • 将驱动程序对象的单个实例传递给所有其他类(Testng 框架)

    我有一个在类示例中初始化的驱动程序对象 我也想将驱动程序对象传递给其他类 但我得到一个空指针异常 我的代码是 样本类 public class sample WebDriver driver Test priority 1 public v
  • 用于 POST 请求的 Django Rest 框架自定义过滤器

    在filters py中 我有一个CustomFilter定义了具有类型值的ComboSortFilter and IntegerListFilter 在views py中 我定义了一个ViewSet 它具有filter class Cus
  • 我可以使用在启动期间配置的 MvcJsonOptions 在自定义中间件中进行序列化吗?

    我正在构建一个带有用于全局异常处理的中间件的 ASP NET Core Api 在Startup类中 我配置了一些用于所有控制器的 JSON 选项 public void ConfigureServices IServiceCollecti