Web API中间件意外短路

以下代码是错误处理中间件的一部分,其目标是即使抛出错误也为客户端提供一致的格式。

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?


喵喔喔
浏览 133回答 1
1回答

慕田峪9158850

我发现了问题所在,这是一个愚蠢的错误。为了测试 500 个错误,我特意向数据库中没有相应列的模型添加了一个属性。这会抛出SqlException一个无效的列名。然而,我错过了第二个例外,它告诉我问题到底是什么:ApiResponse cannot be serialized because it does not have a parameterless constructor.这发生在对 的调用中serializer.Serialize(stringwriter, response)。我引用的示例创建了一个ApiResponse类(response我尝试序列化)。然而,在我学习的示例中,此类没有无参数构造函数,第二个异常停止了执行,但由于我忘记打开开发模式并且我试图抛出异常,所以我没有注意到第二个异常。
打开App,查看更多内容
随时随地看视频慕课网APP