1

一个有趣的观察

在 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?}");
            });
        }

如果您在指示的位置设置断点并运行此代码,hasStartedtrue. 然后,如果您取消注释该app.UseBrowserLink()行,并再次在断点处停止运行代码,您将看到它hasStarted是 now false

那是怎么回事?这意味着如果我在 dev 中使用 browserlink,我可以认为此时我可以修改响应,但是当代码在生产中运行而没有app.UseBrowserLink()任何代码尝试在此时修改响应时将不成功.

为什么 BrowserLink 会导致这种行为?实际上,我喜欢稍后开始渲染,但我希望有或没有 BrowserLink 的起始点相同。即使UserBrowserLink未调用,我如何才能让代码稍后开始渲染?

4

0 回答 0