【发布时间】:2021-05-16 08:01:55
【问题描述】:
我有一个简单的 .net 核心应用程序,它发出 API 输出。
我的Configure 方法很简单:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env )
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}
这是 API 的当前输出:
仅出于测试目的,我想在响应之前和之后添加 HTML 标记:
类似(在 DOM 中手动编辑):
所以我添加了这个:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env )
{
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("<b> Hi</b>");
await next ();
await context.Response.WriteAsync("<b> Bye </b>");
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}
但是当我运行它时,我得到:
失败: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware1 执行请求时发生未处理的异常。 System.InvalidOperationException:标头是只读的,响应有 已经开始了。 使用此 HTML:
我一直在寻找 SO 中的解决方案,但没有找到,该怎么做。
问题:
为什么会这样?我以为我可以通过在管道上调用next() 来控制管道并做任何我想做的事情。
如何在前后添加自定义 HTML 标签?
编辑:
如果我将代码移动到 Configure 方法的末尾,我会看到 the regular output ,没有出现异常,但没有 HTML 标记。
编辑#2:
我也尝试过 OnStarting 事件,但仍然没有成功(我得到一个空白页面):
app.Use(async (context, next) =>
{
context.Response.OnStarting(async state =>
{
if (state is HttpContext httpContext)
{
var request = httpContext.Request;
var response = httpContext.Response;
await response .WriteAsync("<b> Bye </b>"); // <----
}
}, context);
await next();
});
【问题讨论】:
-
你查看源代码了吗?你确定浏览器没有隐藏输出吗?
-
@bcg 是的。我做到了。它只写第一条语句。 i.imgur.com/RG0Ktwb.jpg(用于this代码
-
@OP 响应正文的内容类型是什么?
-
@PeterCsala 应用程序/json。 (我知道在之前和之后添加 HTML 标签是不匹配的。但我在纯文本污染之后。(我不介意在响应时将 appication/json 更改为 text/html ......)
-
@PeterCsala 你能看看this吗?
标签: c# asp.net-core .net-core