一个有趣的观察
在 Asp.Net Core 中,该HttpContext.Response.HasStarted
属性指示响应是否已启动。一旦启动,您就无法更改响应,因为一些字节已经发送到浏览器。
我观察到对我来说看起来很奇怪的行为,其中包含UseBrowserLink()
在 Startup.csConfigure
方法中会导致响应比其他情况更晚开始。
由于在开发中使用 BrowserLink 而不是在生产中很常见,这意味着HttpContext.Response.HasStarted
开发与生产的时间不同,这并不理想。
例子:
我只是使用了基本的 MVC 模板,首先,我尝试了用于 Asp.Net Core 2.2 和 3.1 的模板,它们都表现出这种行为。我将在下面展示 3.1 的代码,因为它是两者中较新的。
索引.cshtml
@{
Layout = "";
}
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Pretty Basic Page</h1>
</body>
</html>
HomeController.cs 动作方法
public IActionResult Index() {
return View();
}
Startup.cs 配置方法
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
app.UseStaticFiles();
//app.UseBrowserLink();//run code, then uncomment and run again
app.Use(async (context, next) => {
await next();
string path = context.Request.Path.ToString();
bool hasStarted = context.Response.HasStarted;
int i = 1; //SET BREAK POINT HERE
});
app.UseRouting();
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
如果您在指示的位置设置断点并运行此代码,hasStarted
则true
. 然后,如果您取消注释该app.UseBrowserLink()
行,并再次在断点处停止运行代码,您将看到它hasStarted
是 now false
。
那是怎么回事?这意味着如果我在 dev 中使用 browserlink,我可以认为此时我可以修改响应,但是当代码在生产中运行而没有app.UseBrowserLink()
任何代码尝试在此时修改响应时将不成功.
为什么 BrowserLink 会导致这种行为?实际上,我喜欢稍后开始渲染,但我希望有或没有 BrowserLink 的起始点相同。即使UserBrowserLink
未调用,我如何才能让代码稍后开始渲染?