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相关的几个项目都打开了,找到关键代码,写上自己的代码,这是一种比较慢但在我看来,有效果的一种调试方式,仁者见仁智者见智吧。
string str = Environment.NewLine;
foreach (System.Reflection.PropertyInfo p in _request.GetType().GetProperties())
{
try
{
object value = p.GetValue(_request, null);
if (value != null)
{
str += p.Name + ":" + value + Environment.NewLine;
}
}
catch (Exception ex)
{
string message = ex.Message;
var exception = ex.InnerException;
while (exception != null)
{
message += Environment.NewLine + exception.Message;
exception = exception.InnerException;
}
System.Diagnostics.Debug.WriteLine("%%%%%%%%%%%%%%% " + message);
}
}
System.Diagnostics.Debug.WriteLine(str);
最重要的是项目生成之后,把生成的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
ASP.NET Core Kestrel 随机404错误的更多相关文章
- ASP.NET Core 如何实现404错误跳转到主页
假如用户在Web浏览器上敲错了URL,访问了ASP.NET Core站点下一个不存在的URL地址,那么默认情况下ASP.NET Core会返回给浏览器著名的404错误,那么有什么办法可以让ASP.NE ...
- ASP.NET Core中显示自定义错误页面-增强版
之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...
- AServer - 基于Asp.net core Kestrel的超迷你http服务器
AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器.它可以集成进你的Core程序里,用来快速的响应Http请求,而不需要集成整个ASP.NET Core MVC ...
- ASP.NET Core中显示自定义错误页面
在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app. ...
- ASP.NET Core Kestrel部署HTTPS
ASP.NET Core配置 Kestrel部署HTTPS.现在大部分网站已经部署HTTPS,大家对于安全越来越重视. 今天简单介绍一下ASP.NET Core 部署HTTPS,直接通过配置Kestr ...
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
在ASP.NET Core中,如果在Kestrel中想使用HTTPS对站点进行加密传输,可以按照如下方式 申请证书 这一步就不详细说了,有免费的和收费的,申请完成之后会给你一个*.pfx结尾的文件. ...
- asp.net core 部署 提示DataProtectionServices 错误
今天在部署asp.net core网站时,因为调用到阿里云的api,api的参数需要加密签名,系统报出了如下错误: warn: Microsoft.Extensions.DependencyInjec ...
- 关于 IIS 上运行 ASP.NET Core 站点的“HTTP 错误 500.19”错误
昨天回答了博问中的一个问题 —— “HTTP 错误 500.19 - Internal Server Error dotnetcore”,今天在这篇随笔中时候事后诸葛亮地小结一下. 服务器是 Wind ...
- 部署asp.net core Kestrel 支持https 使用openssl自签ssl证书
通过openssl生成证书 openssl req -newkey rsa:2048 -nodes -keyout my.key -x509 -days 365 -out my.cer openssl ...
随机推荐
- 【BZOJ 2711】 2711: [Violet 2]After 17 (0-1 背包)
2711: [Violet 2]After 17 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 224 Solved: 153 Description ...
- android studio 目录 文件 解读
- BZOJ4556 HEOI2016 字符串
后缀数组. 复习了后缀数组后发现这题真的很好写. 我们只需要将c依次向前向后扩展,找落在[a,b]区间内的最大值,遍历过程中不断用height数组更新. 复杂度就是后缀数组,比主席树的快多了. By: ...
- [BZOJ2429][HAOI2006]聪明的猴子(最小生成树)
性质:最小生成树上任意两点间的最大边权,一定是这两点间所有路径的最大边权中最小的.证明显然. #include<cstdio> #include<cstring> #inclu ...
- CodeForces - 1016D Vasya And The Matrix
题面在这里! 很明显二进制每一位都是无关的,所以可以先把原问题简化:给矩阵中的每个位置填入0/1,使得特定行/列有奇数个1,其他行/列有偶数个1. 一个比较好想的方法是对行和列 列出 n+m 个异或方 ...
- 【10.3校内测试【国庆七天乐!】】【DP+组合数学/容斥】【spfa多起点多终点+二进制分类】
最开始想的暴力DP是把天数作为一个维度所以怎么都没有办法优化,矩阵快速幂也是$O(n^3)$会爆炸. 但是没有想到另一个转移方程:定义$f[i][j]$表示每天都有值的$i$天,共消费出总值$j$的方 ...
- bzoj 1067 分情况讨论
这道题考察人的严谨,各种情况分类讨论. #include <cstdio> #include <algorithm> #include <map> #define ...
- codeforces 19D D. Points 树套树
D. Points Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/19/problem/D De ...
- 引用计数的cocos2dx对象内存管理和直接new/delete box2d对象内存管理冲突的解决方法
转载请注明: http://blog.csdn.net/herm_lib/article/details/9316601 项目中用到了cocos2dx和box2d,cocos2dx的内存是基于引用计数 ...
- MYSQL GDB SHELL
http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201141165216974/