【发布时间】:2021-05-23 17:17:24
【问题描述】:
我有一个自定义中间件:
app.Use(async (context, next) => {
await context.Response
.WriteAsync($"Before \n");
await next();
await context.Response
.WriteAsync($"After \n");
});
和端点:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
问题是它抛出了一个异常:
应用程序抛出了未处理的异常。 System.InvalidOperationException:标头是只读的,响应已经开始。
但是当我的中间件看起来像这样时:
app.Use(async (context, next) => {
await next();
await context.Response
.WriteAsync($"After \n");
});
一切正常。为什么只能在返回管道中修改响应。
当我像这样使用endpoints.Map.Get而不是endpoints.MapControllerRoute时:
app.UseEndpoints(endpoints => {
endpoints.MapGet("/", async context => {
await context.Response.WriteAsync("Hello World!");
});
});
在这两种情况下一切正常。我知道这可能是一个愚蠢的问题,但我想问为什么当我使用endpoints.MapControllerRoute 时我不能在它通过管道之前修改响应?它说响应已经开始,那么为什么只能在返回路径中修改它而不是在处理请求时修改它?不应该反过来吗。
【问题讨论】:
标签: c# asp.net asp.net-mvc asp.net-core