随笔 - 149  文章 - 8  评论 - 248  阅读 - 21万

ASP.NET Core Kestrel 随机404错误

一、Bug 出现

最近遇到一个很诡异的bug,Visual Studio 2017调试ASP.NET Core 2.2 Web程序的时候,随机性的出现404错误。如下图

事实上这个css文件是存在的,你刷新一下,可能又变成其他的css或js文件404。因此就想到可能是ASP.Net Core框架问题,下一步就准备调试一下源代码。

 

二、.Net Core 源代码调试

一开始用PDB Symbol符号去调试,如果你不了解这种调试方法,这篇文章可以帮到你 https://www.cnblogs.com/tdfblog/p/debugging-asp-net-core-2-source.html
这种方式也可以看到底层代码,但是不能修改代码,并且F12跳转方式也不太方便,你如果想在并发很多请求的时候,定位到是哪个请求404了,是比较困难的。但如果你对底层代码比较熟悉,用这种方式方便快捷。 

为了能找到bug原因,也是拼了,去github上下载了2.2版本的代码。

然后我把和Kestrel相关的几个项目都打开了,找到关键代码,写上自己的代码,这是一种比较慢但在我看来,有效果的一种调试方式,仁者见仁智者见智吧。

复制代码
 1                 string str = Environment.NewLine;
 2                 foreach (System.Reflection.PropertyInfo p in _request.GetType().GetProperties())
 3                 {
 4                     try
 5                     {
 6                         object value = p.GetValue(_request, null);
 7                         if (value != null)
 8                         {
 9                             str += p.Name + ":" + value + Environment.NewLine;
10                         }
11                     }
12                     catch (Exception ex)
13                     {
14                         string message = ex.Message;
15                         var exception = ex.InnerException;
16                         while (exception != null)
17                         {
18                             message += Environment.NewLine + exception.Message;
19                             exception = exception.InnerException;
20                         }
21                         System.Diagnostics.Debug.WriteLine("%%%%%%%%%%%%%%% " + message);
22                     }
23                 }
24                 System.Diagnostics.Debug.WriteLine(str);
View Code
复制代码

最重要的是项目生成之后,把生成的dll覆盖到ASP.NET Core运行时目录。查看运行时文件位置可以在代码里这样。

string path = typeof(StaticFileMiddleware).Assembly.CodeBase;

我这边的目录是 C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\2.2.1,就把刚刚从ASP.NET Core源码生成的dll覆盖到这个目录。
然后在Visual Studio的Windows->Output窗口就能看到输出了。

 

三、问题解决

花了好几天调试,没有找到原因,最后到GitHub ASP.NET Core的Issues里面找到了原因,就是HttpContext被销毁后,就不能在异步任务里面用IHttpContextAccessor获取了,这个时候获取不是null,获取的是一个非空对象,会影响下一次请求。Anyway,在异步任务(非主线程)里用HttpContext一定要小心。

 

补充:后面发现,直接引用源代码也是可以调试的,更方便。

 

重要参考:

https://github.com/aspnet/KestrelHttpServer/issues/2591

https://stackoverflow.com/questions/50661923/signalr-core-1-0-intermittently-changes-the-case-of-http-method-for-non-signalr

posted on   几度夕阳红了  阅读(389)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示