日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時間:2023/12/4 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 福爆 | 博客升级 .NET Core 3.0 又踩一坑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方藍(lán)字關(guān)注“汪宇杰博客”

導(dǎo)語

昨天剛發(fā)了一篇《

生產(chǎn)大爆炸

發(fā)生問題的是已經(jīng)被刪除的博客文章,正常情況下,這些不存在的文章會直接顯示自定義的404頁面,但實際上產(chǎn)生了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頭被重復(fù)添加的問題。但實際上這個頭被添加產(chǎn)生異常的本質(zhì)原因是請求博客文章的Slug這個Action被執(zhí)行了兩次

重現(xiàn)故障

這個問題在開發(fā)時并沒有發(fā)現(xiàn),staging環(huán)境可以重現(xiàn),但由于偷懶,沒測過exception path,happy path過了就發(fā)布了。之所以開發(fā)環(huán)境 works on my machine 是因為這樣一個設(shè)定,大部分 ASP.NET Core 程序都會這么做,畢竟是默認(rèn)模板里的實踐:

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 正式版建了個測試工程,重現(xiàn)了這個問題。

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的請求成功執(zhí)行到 NotFound(); 正常情況應(yīng)該立即執(zhí)行 /error?statusCode=404,當(dāng)實際上 Error 這個 Action 根本沒有跑進去,而是馬上再次執(zhí)行了 Index,id=0

而因為執(zhí)行的邏輯是ReExecute,也就是把action的執(zhí)行結(jié)果放到“父”action里輸出,所以會觸發(fā)兩次pingback頭的添加,導(dǎo)致我博客大爆炸。

復(fù)制粘貼 能跑就行

微軟并不打算在 3.0 的補丁更新中修復(fù)這個問題,而是直接放到了 3.1。好在微軟提供了 workaround,所以我們只能先忍幾個月。

在 UseRouting() 和 UseStatusCodePagesWithReExecute() 之間加入一段神奇的代碼,即可結(jié)束福爆。

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 升級問題多多,資料少少,一不小心就容易領(lǐng)取福報。如果追求刺激和擁抱開源的樂趣,可以像我或者博客園一樣直接踩坑。如果追求穩(wěn)定,不想被公司開除,建議等 3.1 再更新吧~ 畢竟微軟擁抱開源以后的產(chǎn)品,.1 才是能用的(早上更新的 VS2019 16.3.1笑而不語)。

總結(jié)

以上是生活随笔為你收集整理的福爆 | 博客升级 .NET Core 3.0 又踩一坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。