福爆 | 博客升级 .NET Core 3.0 又踩一坑

点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

导语

昨天刚发了一篇《

生产大爆炸

发生问题的是已经被删除的博客文章,正常情况下,这些不存在的文章会直接显示自定义的404页面,但实际上产生了500异常。日志如下:

2019-09-26 00:11:50.8405|RD00155DB89A5B|WARN|Moonglade.Web.Controllers.PostController|Post not found, parameter '2014/7/23/my-surface-pro-3-review-system-software'.,GET https://edi.wang/post/2014/7/23/my-surface-pro-3-review-system-software,Slug,66.249.71.135

2019-09-26 00:11:51.1174|RD00155DB89A5B|WARN|Moonglade.Web.Controllers.PostController|Post not found, parameter '2014/7/23/my-surface-pro-3-review-system-software'.,GET https://edi.wang/error,Slug,66.249.71.135

2019-09-26 00:11:51.1174|RD00155DB89A5B|ERROR|Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware|An unhandled exception has occurred while executing the request.,System.ArgumentException: An item with the same key has already been added. Key: x-pingback

   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)

   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)

   at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.Add(String key, StringValues value)

看上去像是个Pingback HTTP头被重复添加的问题。但实际上这个头被添加产生异常的本质原因是请求博客文章的Slug这个Action被执行了两次

重现故障

这个问题在开发时并没有发现,staging环境可以重现,但由于偷懒,没测过exception path,happy path过了就发布了。之所以开发环境 works on my machine 是因为这样一个设定,大部分 ASP.NET Core 程序都会这么做,毕竟是默认模板里的实践:

if (env.IsDevelopment())

{

    ListAllRegisteredServices(app);

    app.UseDeveloperExceptionPage();

}

else

{

    app.UseExceptionHandler("/error");

    app.UseStatusCodePagesWithReExecute("/error", "?statusCode={0}");

}

出问题的是 UseStatusCodePagesWithReExecute() 这个中间件。

最终在 GitHub 上找到了一个已知问题:

https://github.com/aspnet/AspNetCore/issues/13715

我用 VS2019 16.3.1 + .NET Core 3.0 正式版建了个测试工程,重现了这个问题。

public IActionResult Index(int id = 0)

{

    if (id == 1)

    {

        return NotFound();

    }

    return View();

}

[Route("/error")]

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]

public IActionResult Error(int? statusCode = null)

{

    return Content($"Test Error Action: {statusCode}");

}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

{

    //app.UseStatusCodePages();

    //app.UseExceptionHandler("/error");

    app.UseStatusCodePagesWithReExecute("/error", "?statusCode={0}");

    app.UseHttpsRedirection();

    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>

    {

        endpoints.MapControllerRoute(

            name: "default",

            pattern: "{controller=Home}/{action=Index}/{id?}");

    });

}

访问 /Home/Index?id=1

640?wx_fmt=png

id=1的请求成功执行到 NotFound(); 正常情况应该立即执行 /error?statusCode=404,当实际上 Error 这个 Action 根本没有跑进去,而是马上再次执行了 Index,id=0

640?wx_fmt=png

而因为执行的逻辑是ReExecute,也就是把action的执行结果放到“父”action里输出,所以会触发两次pingback头的添加,导致我博客大爆炸。

复制粘贴 能跑就行

640?wx_fmt=png

微软并不打算在 3.0 的补丁更新中修复这个问题,而是直接放到了 3.1。好在微软提供了 workaround,所以我们只能先忍几个月。

在 UseRouting() 和 UseStatusCodePagesWithReExecute() 之间加入一段神奇的代码,即可结束福爆。

app.UseStatusCodePagesWithReExecute("/error", "?statusCode={0}");

// Workaround .NET Core 3.0 known bug

// https://github.com/aspnet/AspNetCore/issues/13715

app.Use((context, next) => {

    context.SetEndpoint(null);

    return next();

});

实在不行 删库跑路 也挺省心

目前 .NET Core 3.0 升级问题多多,资料少少,一不小心就容易领取福报。如果追求刺激和拥抱开源的乐趣,可以像我或者博客园一样直接踩坑。如果追求稳定,不想被公司开除,建议等 3.1 再更新吧~ 毕竟微软拥抱开源以后的产品,.1 才是能用的(早上更新的 VS2019 16.3.1笑而不语)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sping5——响应式编程

1、响应式编程基础 1.1、什么是响应式编程? 响应式编程是一种面向数据流和变化传播的编程范式。 使用它可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。我们可以使用声明的方式构建应用程序的能…

.NET Core使用NPOI导出复杂Word详解

最近使用NPOI做了个导出Word文档的功能,关于使用.NET Core 导出Word文档的方式有很多。最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第三方框架(并且现在已支持.NET Core,GitHub源码…

Spring Boot 2.0新特性

Spring Boot依赖于Spring,而Spring Cloud又依赖于Spring Boot,因此Spring Boot2.0的发布正式整合了Spring5.0的很多特性,同样后面Spring Cloud最新版本的发布也需要整合最新的Spring Boot2.0内容。 一、新版本特性 1.1,基于 Jav…

为了不让代码“作恶”,能否将道德条款纳入开源许可证?

随着特朗普政府反移民政策的执行,成千上万的移民儿童与父母分离,美国移民和海关执法局(ICE)也因此成为众矢之的。所以,当开源开发者 Seth Vargo 发现前东家 —— Chef 公司最近与 ICE 签订了合同后,进行删库…

dump获取与分析

一、dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫ja…

dump分析死锁

1、制造死锁场景 一段死锁程序 public class DeadLock {public static Object lockA new Object();public static Object lockB new Object();public static void main(String[] args) {new ThreadA().start();new ThreadB().start();} }class ThreadA extends Thread {Ove…

用 C# 来守护 Python 进程

背景目前我主要负责的一个项目是一个 C/S 架构的客户端开发,前端主要是通过 WPF 相关技术来实现,后端是通过 Python 来实现,前后端的数据通信则是通过 MQ 的方式来进行处理。由于 Python 进程是需要依赖客户端进程来运行,为了保证…

针对媒体不实报道误导大众--抹黑C#工资垫底

近注意到一些媒体故意抹黑C# 工资垫底,参见 https://www.toutiao.com/i6741889572931633668/:通过搜索引擎搜索《编程语言薪酬排行:Python薪资最高,Java第二,C# 垫底》:早在2018年就出现这样的标题内容,还是CSDN公众号…

程序员你写的代码,被人挖出了黑产

事件经过看了微博上发表转发1000 、点赞1000次的吐槽陕西省的普通话成绩查询网站代码的微博,后来知乎上又有20万的阅读量这个话题的提问。最终结案这并不是真的陕西省普通话成绩查询网的网址,只不过是和官方查询一样的界面,李鬼”网站&#x…

Java垃圾回收日志解析

1.开启垃圾回收日志 在运行一个java程序时可以在命令行中加入相应的JVM垃圾回收参数,获取程序运行时详细的垃圾回收日志信息。以下是一些大概的参数: -XX:PrintGC与-verbose:gc 这两个命令效果都是一样,打印最基本的回收信息 -XX:PrintGCDe…

感谢有你们,架构师修行之路!

感谢有你们转眼马上就十月一了,听说今年的阵势非常强大,菜菜虽然身在北京,但是可能也目睹不了这个激动时刻了。自从2018年年底决定开始写公众号以来,几乎每个周末都在构思文章,撰写文章。关注公众号的老粉丝应该知道&a…

自定义构建基于.net core 的基础镜像

先说一个问题首先记录一个问题,今天在用 Jenkins 构建项目的时候突然出现包源的错误:/usr/share/dotnet/sdk/2.2.104/NuGet.targets(114,5): error : Unable to load the service index for source https: /usr/share/dotnet/sdk/2.2.104/NuGet.targets(…

操作系统——缓冲区溢出

一、缓冲区溢出介绍 1988年,世界上第一个缓冲区溢出攻击–Morris蠕虫在互联网上泛滥,短短一夜的时间全世界6000多台网络服务器瘫痪或半瘫痪,不计其数的数据和资料被毁。造成一场损失近亿美元的空前大劫难! 那么,缓冲…

从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书

宫哈喽大家好,国庆马上就要来了,在新的第四季度来临之际,祝大家年末能顺顺利利,解决所有的难题。大家可能从我的标题里也能看的出来,老张又要耍花样,搞事情了,近来随着 netcore 3.0 的正式推出&…

操作系统——内存管理——分段和分页

一、 物理地址和逻辑地址 物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地…

Kubernetes攻略之新手上路

在公有云、私有云和混合云的环境中,Kubernetes已经成为规模化部署容器应用的事实标准。最大的公有云平台AWS、谷歌云、Azure、IBM云和Oracle云目前都提供Kubernetes的管理服务(Managed Services)。各大互联网公司也开始将服务部署到Kubernete…

操作系统——深入理解虚拟内存机制

本文来自:https://www.jianshu.com/p/13e337312651 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力: 它为所有进程提…

dotNET Core 中怎样操作 AD?

做企业应用开发难免会跟 AD 打交道,在之前的 dotNET FrameWork 时代,通常使用 System.DirectoryServices 的相关类来操作 AD ,在 dotNET Core 中没有这个命名空间,在张善友大佬的推荐下,知道了 Novell.Directory.Ldap。…

操作系统——页面置换算法

一、页面置换算法简介 操作系统将内存按照页的进行管理,在需要的时候才把进程相应的部分调入内存。当产生缺页中断时,需要选择一个页面写入。如果要换出的页面在内存中被修改过,变成了“脏”页面,那就需要先写会到磁盘。页面置换…

在树莓派4上安装 .NET Core 3.0 运行时及 SDK

点击上方蓝字关注“汪宇杰博客”导语我最近买了个树莓派4,4GB内存高富帅配置,并安装了官方操作系统Raspbian。今天我成功运行了一个ASP.NET Core 3.0 应用程序。我们来看看怎么弄的吧~ARM32 还是 ARM64?需要说明的是,目前无法在树莓派 4 上运…