我按以下方式设置应用程序管道:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context,next) => {
await context.Response.WriteAsync("Custom MiddleWare");
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseWelcomePage(new WelcomePageOptions
{
Path = "/Welcome"
});
app.Run(async (context) =>
{
await context.Response.WriteAsync(Environment.NewLine+"Greetings");
});
}
当我转到页面http://localhost:port/
时,我得到以下输出:
自定义中间件
问候
但是http://localhost:port/welcome
的欢迎页面不起作用并发出错误:
无法访问此网站
现在,如果我像这样修改管道,它就会得到修复:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseWelcomePage(new WelcomePageOptions
{
Path = "/Welcome"
});
app.Use(async (context, next) => {
await context.Response.WriteAsync("Custom MiddleWare");
await next.Invoke();
});
app.Run(async (context) =>
{
await context.Response.WriteAsync(Environment.NewLine+"Greetings");
});
}
我试图理解为什么在第一种情况下没有调用UseWelcomePage
中间件的原因?
答案 0 :(得分:2)
您的问题是第一个中间件写入响应正文
await context.Response.WriteAsync("Custom MiddleWare");
这实际上启动了响应,所以WelcomePage中间件失败,出现异常,因为无法添加标题,您可能会在日志中看到:
An unhandled exception has occurred: Headers are read-only, response has already started.
System.InvalidOperationException: Headers are read-only, response has already started.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.FrameHeaders.ThrowHeadersReadOnlyException()
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.FrameHeaders.Microsoft.AspNetCore.Http.IHeaderDictionary.set_Item(String key, StringValues value)
at Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse.set_ContentType(String value)
at Microsoft.AspNetCore.Diagnostics.RazorViews.WelcomePage.<ExecuteAsync>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---