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 ...
随机推荐
- Hibernate 组合主键映射
在开发过程中创建数据库表时,有时候会发现单纯的创建一个主键是不可行的,有时候就需要多个字段联合保持唯一,本文讲述如何创建组合主键的映射. 例如:记录一个班的考试成绩.学生跟科目是多对多的关系,只有一个 ...
- POJ 2378 Tree Cutting 3140 Contestants Division (简单树形dp)
POJ 2378 Tree Cutting:题意 求删除哪些单点后产生的森林中的每一棵树的大小都小于等于原树大小的一半 #include<cstdio> #include<cstri ...
- 【四边形不等式】HDU3506-Monkey Party
[题目大意] 香蕉森林里一群猴子(n<=1000)围成一圈开会,会长给他们互相介绍,每个猴子需要时间a[i].每次只能介绍相邻的两只猴子x和y认识,同时x所有认识的猴子和y所有认识的猴子也就相互 ...
- [CSAcademy]Squared Ends
[CSAcademy]Squared Ends 题目大意: 给你一个长度为\(n(n\le10^4)\)的数列\(\{A_i\}(A_i\le10^6)\).定义区间\(A_{[l,r]}\)的代价为 ...
- [CSAcademy]A-Game
题目大意: 给你一个只含字符'A'和'B'的串,A和B两人轮流对其中的子串染色,要求被染色的子串中不包含已经被染色的子串. 最后,如果一方染的'A'少,那么这一方胜: 如果双方染的'A'和'B'一样多 ...
- 【洛谷】2990:[USACO10OPEN]牛跳房子Cow Hopscotch【单调队列优化DP】
P2990 [USACO10OPEN]牛跳房子Cow Hopscotch 题目描述 The cows have reverted to their childhood and are playing ...
- 【9.15校内测试】【寻找扩展可行域+特判】【Trie树 异或最小生成树】【模拟:)】
之前都没做出来的同名题简直留下心理阴影啊...其实这道题还是挺好想的QAQ 可以发现,鸟可以走到的点是如下图这样扩展的: 由$(0,0)$向两边扩展,黑色是可以扩展到的点,红色是不能扩展的点,可以推出 ...
- Java虚拟机类加载机制--概述
一.虚拟机类概加载概述 虚拟机将描述类的Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以直接被虚拟机使用的Java类型 Java语言支持动态加载和动态连接. 二.虚拟机加载类 ...
- HBase EndPoint加载失败
概述 参考博客(http://blog.csdn.net/carl810224/article/details/52224441)编写EndPoint协处理器,编写完成后使用Maven打包(使用ass ...
- 原生javascript知识点
JAVASCRIPT 1.变量 1.1概念 变量源于数学,是计算机语言中存储计算结果或表示值抽象概念 计算机有个地方叫内存,变量都会将值存入到内存中,变量就是指向这个值的名字 1.2命名规则 1. 由 ...