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

导语

昨天刚发了一篇《

生产大爆炸

发生问题的是已经被删除的博客文章,正常情况下,这些不存在的文章会直接显示自定义的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

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

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

复制粘贴 能跑就行

微软并不打算在 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笑而不语)。

福爆 | 博客升级 .NET Core 3.0 又踩一坑相关推荐

  1. 我的新浪博客升级啦!

    我的新浪博客升级啦!不知道是因为新浪客服看到了俺的抱怨文章呢,还是因为俺的不懈努力,或者兼而有之.不管怎样,我的新浪博客升级了,域名不再是一串令人郁闷的编号.就像监狱中的犯人终于刑满释放啦!可以用自己 ...

  2. Hexo博客开发之——博客升级

    前言 一直使用hexo写博客,随着博客的增多,编译时的时间越来越长,最近考虑使用给hexo和next主题升级. 博客升级 一 将备份源码使用vscode打开 二 安装hexo npm install ...

  3. 如何高效的编写与同步博客 (.NET Core 小工具实现)

    系列目录 [如何高效的编写与同步博客(一)- 编写 ] 如何高效的编写与同步博客(二)- 快速发布到多个渠道 一.前言 写博客,可以带给我们很多好处,比如可以让我们结识更多志同道合的人:在写博客过程中 ...

  4. angularjs sill 创建项目_开源项目——博客项目MyBlogs.Core,基于.NET 5

    个人博客站项目源码,高性能低占用的博客系统,这也许是我个人目前写过的性能最高的web项目了 .目前日均处理请求数80-120w次,同时在线活跃用户数30-100人,数据量累计已达到100多万条,数据库 ...

  5. 博客升级_原水_新浪博客

    这段时间挺忙的,好久没有写过东西了.BOLG居然升级了,高兴之余看了看别人的博客,当然也就加入了几个博客圈. 有时间再写,睡了.

  6. 2009年2月23日,博客升级公告!

    大家好,今天博客做了一次升级!此次升级主要改动两个地方: 1:博客头部增加"公告条",同时增加博客的"意见反馈" 和"官方博客"入口.以后官 ...

  7. 现代化个人博客系统 ModStartBlog v5.7.0 简约纯白主题,富文本大升级

    系统介绍 ModStart 是一个基于 Laravel 模块化极速开发框架.模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发. 系统完全开源,基于 Apache 2.0 ...

  8. 庆祝我的新浪博客升级到第十级

    自我庆祝一下啊 随便说说新浪的博客系统,个人觉得她很人性化,很温馨,让人感觉很安静. 身为Programmer的我,按理应该在程序员的网站开博才对(比如:csdn,cnblogs),但我喜欢安静地写东 ...

  9. WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?

    目录 .NET Conf 2019 Window Forms 设计器 2019 9.23-9.25召开了 .NET Conf 2019 大会,大会宣布了 .Net Core 3.0 正式版.这两天我也 ...

最新文章

  1. 哪些因素影响数据存储系统的IOPS性能?
  2. 「尖峰对话」问题征集:向张宏江和John Hopcroft 近距离提问
  3. .NET一个线程更新另一个线程的UI(两种实现方法及若干简化)
  4. Windows安装Python3
  5. 基于 Roslyn 实现动态编译
  6. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析...
  7. 编辑距离、拼写检查与度量空间:一个有趣的数据结构
  8. 手写模拟器,将电子文档转换为手写字体,就用这个软件
  9. 完整的CJK Unicode范围(5.0版)
  10. Android小提示四
  11. 开发中好用的工具(长期待更)
  12. Online Safe Trajectory Generation For QuadrotorsUsing Fast Marching Method and Bernstein Basis Polyn
  13. ZOJ - 3939
  14. Word2vec模型原理与keras、tensorflow实现word2vec
  15. 浅谈动感歌词:网易云歌词分析
  16. Centos文件清理
  17. 计算机毕业设计ssm文学阅读平台
  18. python协程和网易云歌单
  19. CTF解题记录-Misc-“短信”
  20. 计算机毕业设计Python+uniapp+安卓移动LYQ电子商城APP(WEB+APP+LW)

热门文章

  1. 六、 跨多个WebService管理Session
  2. 不知道为什么IList.Contains()总是返回FALSE
  3. ios 启用 证书_如何在iOS 10中启用就寝提醒,轻柔的唤醒和睡眠跟踪
  4. 询问HTG:白噪声屏幕保护程序,有效的文件命名以及从密码泄露中恢复
  5. 阿里云大学课程学习有奖征文活动现在开始
  6. 异常检测之浅谈入侵检测
  7. 【转】URL编码(encodeURIComponent和decodeURIComponent)
  8. vb.net2.0 Hmac-md5加密算法
  9. 组策略链接顺序优先级
  10. 彻底解决跨浏览器下PHP下载文件名中的中文乱码问题