.NET Core 3.1环境下C# HttpListener单次访问触发两次循环的问题
现象的根本原因
这不是HttpListener的功能异常,是Chromium内核浏览器(Edge、Chrome)的默认访问逻辑导致的:
- 第一次
while循环执行,对应你手动访问localhost、刷新页面时,浏览器获取页面HTML发起的根路径(/)GET请求。 - 第二次
while循环执行,对应浏览器加载完HTML后,自动发起的/favicon.ico图标请求——浏览器需要获取站点图标展示在标签页上,由于你没有在响应里声明自定义图标路径,就会默认向根路径拉取favicon资源。你的程序没有对这个请求做特殊过滤,会将其作为普通页面请求处理,输出完整HTML内容,因此多打印一次Response done日志。
验证方法
在获取请求上下文后,新增一行日志打印请求路径:
Console.WriteLine($"当前请求路径:{context.Request.Url.AbsolutePath}");
再次用浏览器访问时,日志会清晰展示两次请求的路径分别是/和/favicon.ico,和上述逻辑完全匹配。
优化处理方式
- 收到请求后先判断路径,如果是
/favicon.ico请求,直接给响应设置404状态码,不必返回完整HTML。 - 在返回的HTML内容中添加
<link rel="icon" href="data:,">,显式告知浏览器无需请求站点图标,即可避免第二次自动请求。 - 扩展服务功能时,不要对所有路径的请求统一返回首页内容,需要基于请求路径做路由分发,匹配对应的处理逻辑。
内容的提问来源于stack exchange,提问作者Troskyvs
相关产品推荐
相关产品推荐

