net6 發布已經有一個多月了,因為我的LuckyDraw app是使用Azure app service,當時我查了一下app service還沒有ready,昨天我又查看了一下,發現app service已經默認裝了net6。
那就是時候升級我的LuckyDraw了,如果大家的app也是用c#來開發的話,那這篇文章給大家分享一下我的升級方法。
首先,先更新csproj,把之前的LTS 3.1改成?net6.0
。同時也把 c# 語言改用版本 9,這樣就可以更多的使用一些方便的語法。
<PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><LangVersion>7.3</LangVersion></PropertyGroup>
改成:
<PropertyGroup><TargetFramework>net6.0</TargetFramework><LangVersion>9</LangVersion></PropertyGroup>
第二步,把所有對應的library也升級到最新版本
<ItemGroup><PackageReference Include="AdaptiveCards" Version="1.2.4" /><PackageReference Include="Microsoft.Bot.Builder" Version="4.9.3" /><PackageReference Include="WindowsAzure.Storage" Version="9.3.3" /><PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.13.1" /><PackageReference Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Version="3.1.3" /><PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.3" /><PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="3.0.2" /><PackageReference Include="AspNetCore.HealthChecks.Uris" Version="3.0.0" /><PackageReference Include="Serilog.AspNetCore" Version="3.2.0" /><PackageReference Include="Serilog.Sinks.ApplicationInsights" Version="3.1.0" /><PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" /><PackageReference Include="Swashbuckle.AspNetCore" Version="5.2.1" /><PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.2.1" /><PackageReference Include="System.Net.Http.Json" Version="3.2.1" /></ItemGroup>
改成
<ItemGroup><PackageReference Include="AdaptiveCards" Version="2.7.3" /><PackageReference Include="Microsoft.Bot.Builder" Version="4.15.0" /><PackageReference Include="WindowsAzure.Storage" Version="9.3.3" /><PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.19.0" /><PackageReference Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Version="6.0.0" /><PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.21" /><PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="6.0.1-rc2.4" /><PackageReference Include="AspNetCore.HealthChecks.Uris" Version="6.0.1" /><PackageReference Include="Serilog.AspNetCore" Version="4.1.0" /><PackageReference Include="Serilog.Sinks.ApplicationInsights" Version="3.1.0" /><PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" /><PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /><PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.2.3" /><PackageReference Include="System.Net.Http.Json" Version="6.0.0" /></ItemGroup>
編譯后,會發現有些warning,雖然不改也可以,但是有強迫癥的我,必須把他們改掉。
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest).AddJsonOptions(opt =>{...opt.JsonSerializerOptions.IgnoreNullValues = true;...});
3.1中的?SetCompatibilityVersion(CompatibilityVersion.Latest)
?已經不再被使用了,直接去掉就可以。
另外,System.Text.Json 中的?IgnoreNullValues
?也被標記成了 obsolete,將會在以后版本中移除,我們可以改成?opt.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
,可以參考這個文檔?JsonSerializerOptions.IgnoreNullValues Property (System.Text.Json) | Microsoft Docs
改完后是:
services.AddMvc().AddJsonOptions(opt =>{...opt.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;...});
最后還有一個warning是 teams bot的,是說:
warning CS0618: 'AppCredentials.TrustServiceUrl(string, DateTime)' is obsolete: 'TrustServiceUrl is not a required part of the security model.'
所以,如果大家在teams app的代碼中使用了?TrustServiceUrl()
,那當你升級到最新的 teams sdk后,就可以刪除這句了。
MicrosoftAppCredentials.TrustServiceUrl(botServiceUrl, dateTimeService.UtcNow.AddDays(7).DateTime);
改完后,checkin,一切正常,贊!說明 .net 6 在向前兼容上做的很不錯。
雖然這個只是最最簡單的升級方法,代碼層面還沒有使用 .net6 和 c# 9 帶給我的新功能,我會在后面的文章中繼續介紹我如何enable nullable 和 implicit using,特別是 nullable,可以極大的提高代碼的質量。
?