1、Bug 出现css
最近遇到一个很诡异的bug,Visual Studio 2017调试ASP.NET Core 2.2 Web程序的时候,随机性的出现404错误。以下图html
事实上这个css文件是存在的,你刷新一下,可能又变成其余的css或js文件404。所以就想到多是ASP.Net Core框架问题,下一步就准备调试一下源代码。git
2、.Net Core 源代码调试github
一开始用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);
最重要的是项目生成以后,把生成的dll覆盖到ASP.NET Core运行时目录。查看运行时文件位置能够在代码里这样。ide
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窗口就能看到输出了。spa
3、问题解决线程
花了好几天调试,没有找到缘由,最后到GitHub ASP.NET Core的Issues里面找到了缘由,就是HttpContext被销毁后,就不能在异步任务里面用IHttpContextAccessor获取了,这个时候获取不是null,获取的是一个非空对象,会影响下一次请求。Anyway,在异步任务(非主线程)里用HttpContext必定要当心。
补充:后面发现,直接引用源代码也是能够调试的,更方便。
重要参考: