为了账号安全,请及时绑定邮箱和手机立即绑定

Web API中间件意外短路

Web API中间件意外短路

C#
喵喔喔 2023-07-09 14:59:14
以下代码是错误处理中间件的一部分,其目标是即使抛出错误也为客户端提供一致的格式。Accept当标头设置为时,我尝试将响应序列化为 XML application/xml,否则返回 JSON。if (context.Request.Headers["Accept"] == "application/xml"){    context.Response.ContentType = "application/xml";    using (var stringwriter = new StringWriter())    {        var serializer = new XmlSerializer(response.GetType());        serializer.Serialize(stringwriter, response);        await context.Response.WriteAsync(stringwriter.ToString());    }}else {    context.Response.ContentType = "application/json";    var json = JsonConvert.SerializeObject(response);    await context.Response.WriteAsync(json);}该else块按预期工作。如果我在声明的行上设置断点XmlSerializer,执行就会停止。如果我在下一行设置断点,则永远不会命中断点;响应已发送给客户端。我的中间件配置如下:public void Configure(IApplicationBuilder app, IHostingEnvironment env)    {        app.UseStatusCodePagesWithReExecute("/error/{0}");        app.UseExceptionHandler("/error/500");        app.UseHsts();        app.UseMiddleware<ErrorWrappingMiddleware>();        app.UseMvc();    }context.Response.WriteAsync(stringwriter.ToString());为什么在块中调用之前就将响应返回给客户端if?
查看完整描述

1 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

我发现了问题所在,这是一个愚蠢的错误。

为了测试 500 个错误,我特意向数据库中没有相应列的模型添加了一个属性。这会抛出SqlException一个无效的列名。然而,我错过了第二个例外,它告诉我问题到底是什么:

ApiResponse cannot be serialized because it does not have a parameterless constructor.

这发生在对 的调用中serializer.Serialize(stringwriter, response)。我引用的示例创建了一个ApiResponse类(response我尝试序列化)。然而,在我学习的示例中,此类没有无参数构造函数,第二个异常停止了执行,但由于我忘记打开开发模式并且我试图抛出异常,所以我没有注意到第二个异常。


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信