如何从ASP.NET Core异常中间件返回404



我的应用程序使用自定义的NotFoundException,我使用ASP.NET核心异常处理程序中间件来拦截异常并返回404响应。

这是中间件的简化版本。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
app.UseExceptionHandler(appBuilder => {
appBuilder.Run(async context => {
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
var responseContent = new {
StatusCode = context.Response.StatusCode,
Message = "Not found"
};
await context.Response.WriteAsJsonAsync(responseContent);
});
});
...
}

我希望这段代码返回404响应,内容为JSON,但请求只是出错。如果我使用HttpClient运行测试,我会得到以下错误:

System.Net.Http.HttpRequestException: 'Error while copying content to a stream.'

如果我将中间件中的状态代码更改为404以外的任何代码,它似乎可以按预期工作。

// changing this line
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
// to this line will successfully return the result
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;

这个404代码一直在工作,直到我将目标框架从netcoreapp3.1更改为net5.0。在以net5.0为目标时,为了成功地从异常中间件返回带有JSON的404,我需要更改什么?

问题似乎是从这次更新升级到ExceptionHandlerMiddleware。

添加此行修复了网站实时运行时的响应。

await context.Response.CompleteAsync();

然而,这一行并没有修复我使用TestServer的测试,因为TestServer还没有实现CompleteAsync。

相关内容

  • 没有找到相关文章

最新更新