以下代码是错误处理中间件的一部分,其目标是即使抛出错误也为客户端提供一致的格式。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
我尝试序列化)。然而,在我学习的示例中,此类没有无参数构造函数,第二个异常停止了执行,但由于我忘记打开开发模式并且我试图抛出异常,所以我没有注意到第二个异常。
- 1 回答
- 0 关注
- 63 浏览
添加回答
举报
0/150
提交
取消