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

歡迎訪問 默认站点!

默认站点

當前位置: 首頁 >

最全的 netcore 3.0 升级实战方案

發布時間:2023/12/4 30 豆豆
默认站点 收集整理的這篇文章主要介紹了 最全的 netcore 3.0 升级实战方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、哈嘍大家中秋節(后)好呀!感覺已經好久沒有寫文章了,但是也沒有偷懶喲,我的視頻教程《系列一、NetCore 視頻教程(Blog.Core)》也已經錄制八期了,還在每周末同步更新中,歡迎大家多多指教。

2、除此之外呢,我也在平時的時間幫朋友開發了一個小項目,就是使用 .net mvc+vue+ele+mongo 框架寫的項目,之前一直想著用mvc結合著vue寫,這次也終于上手了,不過是一個小的demo,因為是朋友的項目,所以就不開源了。

言歸正傳,?? 從2018年8月就開始聽說 netcore 要準備3.0了,? 到了近期 v3.0.0-preview9 的發布,官方也最終定稿不會再更新了,??? 接著馬上 在下周 9月23日至25日 .NET Conf 社區大會上,會正式推出 netcore3.0 版本,?(最后 ? 微軟會將 .netcore 和 .net 進一步融合,推出完美跨平臺 net 5.0 版本,這里暫時先不說),單單從這一年里 netcore 3.0 的快速發展、迭代以及接受用戶的反饋進一步修改中,我們就能感覺的到,微軟是如何的有希望并且有信心在未來的發展中,將微軟系產品進一步融入到廣大開發者的心中,我們也要有信心微軟能做到這一點。

在netcore 3.0 馬上要到來之際,我也要嘗嘗鮮,我肯定不是第一個吃螃蟹的人,博客園這兩個月也是一直轟轟烈烈的進行 3.0 的更新和迭代,不過過程是怎樣的吧,至少結果目前還是可以的,也可以作為一個成功案例給大家提供一些建議和思路。

感覺嘗試就是成功的一半,所以我在中秋節這兩天,也把 Blog.Core? 項目給提升到了 3.0 版本,大家現在看的我的在線地址(http://apk.neters.club/index.html) 就是netcore 3.0 的,總體看起來,可能沒有什么差別,而且運行中也沒有發現任何問題,(具體的請看我的后臺項目:http://vueadmin.neters.club/),不過這次官方更新的東西還是稍微挺多的,所以我這里就統一做下記錄,方便大家吧,希望每一個在使用 netcore 的小伙伴都能從這里得到一些幫助,雖然官網也有一些記錄,但是我看了看,英文的可能有些小伙伴不好理解,盡管有中文翻譯版,可是看著不是很通順,而且也不是很全,大家可以看看:地址。

當然不僅僅包括下邊的這幾點,我還在慢慢更新,如果你使用到了我 blog.core 項目中沒有用到的技術,并且自己在更新 3.0 的時候出現了問題,可以和我聊聊,我在下邊補充下,爭取達到一個最全的解決方案合集。

?

好啦,廢話到此結束,馬上開始今天的遷移報告內容!???

netcore 1.0 到 2.0 主要的是網絡和云服務的升級,那 net core 從2.0 到 3.0 更新的是哪些呢?

這里我就簡單的列舉了下這一年來netcore 3.0 更新的比較熱門的特性,當然還有其他的,因為本篇文章主要是講解升級實戰,所以對以下特性就不過多的鋪開講解。

性能、性能、性能,重要的地方說三遍

在機器學習,AI等很好的支持

對Winform、WPF的支持

gRPC的添加

支持 API 授權在單頁面應用 (Spa) 中提供身份驗證、實現 Open ID Connect 的IdentityServer結合。

Worker Service 模板,為開發做服務或監控微服務相關Bus

Microsoft.Data.SqlClient:獨立存在于.NET Framework和.NET Core中

ReadyToRun

HttpClient支持HTTP/2

Json.NET 不在內置在框架內,使用System.Text.Json

HostBuilder 替換掉WebHostBuilder

Blazor 是一個用于使用 .NET 生成交互式客戶端 Web UI 的框架,用c#開發前端

.NET?Framework不支持.NET?Standard 2.1

IL linker

發布成單個程序 dotnet publish -r win10-x64 /p:PublishSingleFile=true

那下面我就針對我的 Blog.Core 項目,坐下遷移的說明,一共八個方面,不是很多,大家可以一一對比下。

操作前必備:備份文件,這個很重要,我們要玩兒新花樣,肯定要做好備份文件,可別因為升級失敗,而不好回退。

當然我的操作是直接操作的 Blog.Core 項目,因為項目在 git 上,如果不成功,就直接回退,這種資源管理工具還是很有必要的。

1、安裝SDK

?首先可以查看自己的本地 SDK 是什么版本的,比如我的目前只有 2.1和 2.2 :

所以,如果我們要升級 3.0 的話,就肯定要安裝指定的 SDK 了,下載地址:https://dotnet.microsoft.com/download/visual-studio-sdks

選擇指定版本的 SDK ,然后進行安裝,最后我們就可以看到我們的本地已經安裝好了:

?這里我們可以看到我們的 3.0 的 SDK 已經安裝好了,最后再做個驗證,就是在我們的 VS 2019 中,查看是否有 3.0 的框架:

竟然沒有??!!別慌,這里有兩個方法:

1、工具 -> 選項 -> 項目與解決方案 -> 右側,勾選預覽版(這個方案是2019 最舊版本的,已取消請忽略)。

2、在工具 -> 選項 -> 環境里(正規是使用這個):

然后我們把 vs 重新啟動一下,發現已經有了:

安裝好了 SDK,我們就已經是成功了一半了,下邊我們就正式開始升級打怪之路。

但是這里還有一個問題,就是打開的項目屬性里,雖然有了 3.0 的框架,但是新建的項目,依然沒有 3.0 的部分,那這個是為什么呢?

這里網上的方案是:不要用preview8或者9,這兩個版本出不來core3.0的選項,preview7沒有問題。如果非要用最新版,可以用dotnet new創建項目,或者等下星期的 net core 3.0正式版出來,這樣就不用來來回回勾選了。

Tips:感謝 @ 給出建議

https://dotnet.microsoft.com/download/dotnet-core/3.0
這個頁面的Tips已經說了,有可能下周就是Core3.0和VS 2019的16.3一起發布,猜測應該就是更新就行了,目前我的VS版本是16.2.5

2、更新框架以及所有依賴

剛剛我們已經成功的安裝好了 3.0 的 SDK ,那接下來就是正式開始升級項目,首先呢,就是需要更新我們的目標框架,這里有兩種方法:

第一種是直接修改我們的項目文件 .csproj ,修改節點 <TargetFramework>netcoreapp3.0</TargetFramework>,并移除關于 Aspnetcore 2.2 相關的包;

第二種就是直接右鍵項目,屬性,應用程序,修改目標框架到 netcore 3.0 就行,就是上文截圖中顯示的那個,我個人采用的是這種方法。

記得要把項目從底層開始更新,比如從 Model 層和 Common 層開始更新,然后最后更新 API 層,就是從下向上,(這里有個小問題,就是出現修改了,CTRL S 保存后,又重新回到2.2了,可以重啟下項目,重啟下vs就行了)。

代碼修改對比圖:

(netcore 3.0 修改sdk框架)

?接下來,就是把項目中用到的所有nuget包都更新到最新的版本,因為有些是為了迎接 netcore 3.0,做了相應的修改,比如下午說到的 swagger ,一定要更新到 5.0+版本。

?到了這里,我們的項目已經把框架和依賴升級完成了,是不是很簡單,重新編譯,運行,這里肯定會有錯誤,別著急,接下來我們就進一步修改 Code 中出現的bug。?

3、宿主機變化(Program.cs)

netcore 3.0,對 host 做了調整,底層沒有發生太多的變化,這里不細說,主要說要修改的地方,更新的內容,我會在視頻里,詳細給大家講解。

在 Program.cs 文件中,修改HostBuilder生成方法,注意在main 方法里引用也要做相應的修改

代碼修改對比圖:

?(Program.cs 修改 host 宿主機)

CODE:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseStartup<Startup>()
.UseUrls("http://localhost:8081")
//這里是配置log的
.ConfigureLogging((hostingContext, builder) =>
{
builder.ClearProviders();
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
builder.AddConsole();
builder.AddDebug();
});
});

4、Host 環境變量(Startup.cs)

從上邊我們也可以看得出來,官方更新了 host ,所以自然而然的,也更新了部分的命名空間,這樣就出現了一個問題:

當?Microsoft.Extensions.Hosting 在 2.1 中被引入時,某些類型?IHostingEnvironment?和?IApplicationLifetime?是從 Microsoft.AspNetCore.Hosting 復制的。某些 3.0 更改會導致應用同時包含 Microsoft.Extensions.Hosting 和 Microsoft.AspNetCore.Hosting 兩個命名空間。當同時引用兩個命名空間時,對這些重復類型的任何使用都會導致"不明確的引用"編譯器錯誤。

所以官方就對某些命名空間和類做了修改:

Obsolete types (warning):

Microsoft.Extensions.Hosting.IHostingEnvironment
Microsoft.AspNetCore.Hosting.IHostingEnvironment
Microsoft.Extensions.Hosting.IApplicationLifetime
Microsoft.AspNetCore.Hosting.IApplicationLifetime
Microsoft.Extensions.Hosting.EnvironmentName
Microsoft.AspNetCore.Hosting.EnvironmentName

New types:

Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
Microsoft.Extensions.Hosting.IHostApplicationLifetime
Microsoft.Extensions.Hosting.Environments

這個不用記憶,到時候使用的時候,會有提示的,那我們的項目中,有哪個地方需要修改呢,就是配置中間件的時候有一個環境變量配置需要修改下:

1、將 IHostingEnvironment env 改成 IWebHostEnvironment env,這個時候會報錯,因為命名空間變了;

2、所以需要引用新的命名空間:using Microsoft.Extensions.Hosting;

到了這里,我們就完全修改好了宿主機的部分,現在項目還不能正常的使用,還需要繼續修改 mvc 部分,別著急,慢慢往下看。


剛剛我們修改了宿主機 host ,啟動項目的時候,還是會有錯誤,主要提示我們的中間件 .UseMvc() 已經不能被使用了,3.0后,對mvc做了較大的修改,主要從兩個方面,一個是服務注冊,一個是中間件的拆分:

1、MVC 服務注冊(Startup.cs)

在 netcore 3.0 中,官方對 mvc 服務做了細分,主要有以下幾個部分:

services.AddMvc();// 我們平時2.2使用的,最全面的mvc服務注冊
services.AddMvcCore();// 稍微精簡的mvc注冊
services.AddControllers();// 適用于api的mvc部分服務注冊
services.AddControllersWithViews();//含有api和view的部分服務注冊
services.AddRazorPages();//razor服務注冊

我們看出來,如果我們的項目是webapi的,那只需要注冊 .AddControllers() 這個就夠了,.AddMvc() 里邊服務太多,會造成浪費,而大材小用。

代碼修改對比圖:

2、MVC 中間件的拆分(Startup.cs)

除了上邊的 mvc 服務注冊以外,我們還需要對 UseMvc() 中間件做修改。

官方已經正式去掉了Mvc()這個短路中間件,取代他的是 .UseEndpoints() 方法,我們可以做以下修改:

代碼修改對比圖:

CODE:

app.UseRouting();//路由中間件
// 短路中間件,配置Controller路由
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});

到了這里,我們已經完成了 netcore 2.2 到 net core 3.0 的最簡單的升級,如果你想嘗試下,可以自己手動建立一個空的 2.2 項目,實現到 3.0 的遷移,我們運行項目,可以看到已經成功的啟動起來,還是很成功的。這里要注意下中間件的順序,一般的順序是這樣的:

app.UseStaticFiles();

app.UseRouting();

app.UseCors();

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chat");
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

那是不是到了這里已經完成了呢,答案當然是否定的,我們的項目不可能這么簡單,肯定還會有其他的依賴,還有各種各樣的中間件,那我們在升級的過程中,還會有哪些地方需要做處理呢,就比如下邊的這些。

在 netcore 3.0 中,要求我們使用的是 swagger 5.0 ,而且變化的內容也挺多的,但是原理和思路都是一樣的,大家一看就知道了,所以我就直接貼代碼了。

1、代碼修改對比圖(ConfigureServices)

?這次的修改,主要是服務的注冊部分,中間件沒有變化,所以我們直接在 startup.cs 中的 configureService 中,做下調整:

這里要注意下,需要引用兩個 Nuget 包:Swashbuckle.AspNetCore 和 Swashbuckle.AspNetCore.Filters

2、修改后的完整代碼

services.AddSwaggerGen(c =>
{
typeof(ApiVersions).GetEnumNames().ToList().ForEach(version =>
{
// swagger文檔配置
c.SwaggerDoc(version, new OpenApiInfo
{
Version = version,
Title = $"{ApiName} 接口文檔",
Description = $"{ApiName} HTTP API " + version,
Contact = new OpenApiContact { Name = ApiName, Email = "Blog.Core@xxx.com", Url = new Uri("https://www.jianshu.com/u/94102b59cc2a") },
License = new OpenApiLicense { Name = ApiName, Url = new Uri("https://www.jianshu.com/u/94102b59cc2a") }
});
// 接口排序
c.OrderActionsBy(o => o.RelativePath);
});

// 配置 xml 文檔
var xmlPath = Path.Combine(basePath, "Blog.Core.xml");
c.IncludeXmlComments(xmlPath, true);
var xmlModelPath = Path.Combine(basePath, "Blog.Core.Model.xml");
c.IncludeXmlComments(xmlModelPath);

c.OperationFilter<AddResponseHeadersFilter>();
c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
// 很重要!這里配置安全校驗,和之前的版本不一樣
c.OperationFilter<SecurityRequirementsOperationFilter>();

// 開啟 oauth2 安全描述
c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
Description = "JWT授權(數據將在請求頭中進行傳輸) 直接在下框中輸入Bearer {token}(注意兩者之間是一個空格)\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey
});
});

代碼中,變化比較大的地方,我已經用紅色標注,某些又做了注解,不過大部分的內容還是和之前是一樣的,相信大家都能看得懂。

?關于依賴注入框架 Autofac 的變化,整體來說不是很大,主要是在依賴容器的使用上,在 2.2 的時候,我們是直接修改的的 ConfigureServices ,然后將容器實例給 return 出去,但是 3.0 之后,ConfigureServices 不能是返回類型了,只能是 void 方法,那我們就不用 return 出去了,官方給我們提供了一個服務提供上工廠,我們從這個工廠里拿,而不是將服務配置 return 出去。

1、代碼修改對比圖

?1、首先我們需要在 Program.cs 中的 CreateHostBuilder 中,添加Autofac的服務工廠:

2、然后在 startup.cs 文件中,新建一個?ConfigureContainer(ContainerBuilder builder) 的方法,里邊的內容就是我們之前寫的 Autofac 的代碼,把之前在 configureService 中的代碼都刪掉。

只不過我們這里是注入了 builder 的實例對象,不用new了,然后也不用 build 容器了,交給了 hotst 幫助我們一起 build。

如果有任何看不懂的,請查看我的 Blog.Core 項目中的代碼。

2、修改后的完整代碼

?Startup.cs 中,新增 ConfigureContainer 方法,刪除 ConfigureService中,所有有關 Autofac 的內容:

public void ConfigureContainer(ContainerBuilder builder)
{
var basePath = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath;

//注冊要通過反射創建的組件
//builder.RegisterType<AdvertisementServices>().As<IAdvertisementServices>();
builder.RegisterType<BlogCacheAOP>();//可以直接替換其他攔截器
builder.RegisterType<BlogRedisCacheAOP>();//可以直接替換其他攔截器
builder.RegisterType<BlogLogAOP>();//這樣可以注入第二個

// ※※★※※ 如果你是第一次下載項目,請先F6編譯,然后再F5執行,※※★※※

#region 帶有接口層的服務注入

#region Service.dll 注入,有對應接口
//獲取項目絕對路徑,請注意,這個是實現類的dll文件,不是接口 IService.dll ,注入容器當然是Activatore
try
{
var servicesDllFile = Path.Combine(basePath, "Blog.Core.Services.dll");
var assemblysServices = Assembly.LoadFrom(servicesDllFile);//直接采用加載文件的方法 ※※★※※ 如果你是第一次下載項目,請先F6編譯,然后再F5執行,※※★※※

//builder.RegisterAssemblyTypes(assemblysServices).AsImplementedInterfaces();//指定已掃描程序集中的類型注冊為提供所有其實現的接口。


// AOP 開關,如果想要打開指定的功能,只需要在 appsettigns.json 對應對應 true 就行。
var cacheType = new List<Type>();
if (Appsettings.app(new string[] { "AppSettings", "RedisCachingAOP", "Enabled" }).ObjToBool())
{
cacheType.Add(typeof(BlogRedisCacheAOP));
}
if (Appsettings.app(new string[] { "AppSettings", "MemoryCachingAOP", "Enabled" }).ObjToBool())
{
cacheType.Add(typeof(BlogCacheAOP));
}
if (Appsettings.app(new string[] { "AppSettings", "LogAOP", "Enabled" }).ObjToBool())
{
cacheType.Add(typeof(BlogLogAOP));
}

builder.RegisterAssemblyTypes(assemblysServices)
.AsImplementedInterfaces()
.InstancePerLifetimeScope()
.EnableInterfaceInterceptors()//引用Autofac.Extras.DynamicProxy;
// 如果你想注入兩個,就這么寫 InterceptedBy(typeof(BlogCacheAOP), typeof(BlogLogAOP));
// 如果想使用Redis緩存,請必須開啟 redis 服務,端口號我的是6319,如果不一樣還是無效,否則請使用memory緩存 BlogCacheAOP
.InterceptedBy(cacheType.ToArray());//允許將攔截器服務的列表分配給注冊。
#endregion

#region Repository.dll 注入,有對應接口
var repositoryDllFile = Path.Combine(basePath, "Blog.Core.Repository.dll");
var assemblysRepository = Assembly.LoadFrom(repositoryDllFile);
builder.RegisterAssemblyTypes(assemblysRepository).AsImplementedInterfaces();
}
catch (Exception ex)
{
throw new Exception("※※★※※ 如果你是第一次下載項目,請先對整個解決方案dotnet build(F6編譯),然后再對api層 dotnet run(F5執行),\n因為解耦了,如果你是發布的模式,請檢查bin文件夾是否存在Repository.dll和service.dll ※※★※※" + ex.Message + "\n" + ex.InnerException);
}
#endregion
#endregion


#region 沒有接口層的服務層注入

////因為沒有接口層,所以不能實現解耦,只能用 Load 方法。
////注意如果使用沒有接口的服務,并想對其使用 AOP 攔截,就必須設置為虛方法
////var assemblysServicesNoInterfaces = Assembly.Load("Blog.Core.Services");
////builder.RegisterAssemblyTypes(assemblysServicesNoInterfaces);

#endregion

#region 沒有接口的單獨類 class 注入
////只能注入該類中的虛方法
builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(Love)))
.EnableClassInterceptors()
.InterceptedBy(typeof(BlogLogAOP));

#endregion

//這里不要再 build 了
//var ApplicationContainer = builder.Build();

}

program.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) //<--NOTE THIS
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseStartup<Startup>()
.UseUrls("http://localhost:8081")
.ConfigureLogging((hostingContext, builder) =>
{
builder.ClearProviders();
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
builder.AddConsole();
builder.AddDebug();
});
});

3、變化的核心點

就是將我們的Autofac的容器,從 configureService 中,轉向了我們的宿主機中了,步驟是:

1、刪除 ConfigureService 中的所有 Autofac 配置內容;

2、將剛剛刪除的配置內容,拷貝到新建一個 ConfigureContainer ?方法中;

3、在 ConfigureContainer 方法中,不要進行 build 操作,然后 Main 入口方法中的 Build() 去執行。

4、在 Program.cs 的 CreateHostBuilder 中,新增服務工廠實例。

好了,到現在,我們可以嘗試看看 Autofac 依賴注入框架,已經可以正常的使用了。

隨著netcore 3.0 的更新,sqlsugar當然也要做相應的優化處理,主要是為了配合 3.0 做處理,作者凱旋兄還是很負責的,及時做了調整,目前 sqlsugar 的版本是 5.0.9 ,我們如果使用 netcore 3.0 的話,就必須要使用。

1、這個 5.0.9 的版本,如果不使用的話,可能會有一個映射錯誤:

?如果遇到了這個錯誤,直接不要問,更新到最新版本就行。

2、如果更新了以后,發現還有錯誤,一個《未將對象引用到對象的實例》:

這個時候,你可以嘗試重新生成下數據庫,好像只需要創建下表結構就行,數據可以導入,記得做好生產環境數據庫備份

其他還沒有發現什么問題。

這一塊我也發現有點兒問題,好像目前在controller 上配置?[Authorize(Policy = Permissions.Name)] 并不能實現授權的目的,就算是用官網的在短路節點配置也不行, .RequireAuthorization(new AuthorizeAttribute() { Policy = Permissions.Name, });,所以,起作用的還是我的授權公約過濾器,并不是加的特性,我還在調試,如果你正好寫到 netcore 3.0 授權策略了,請評論,不勝感激。

這個地方其實很簡單,剛剛在將 swagger 的時候,我也說到了,有一個地方需要我們注意, 就是安全校驗的配置上,現在發生了變化,從服務添加變成了過濾器:

之前我的 Blog.Core 項目使用了權限過濾器公約,這樣就算 controller 沒有配置 Authorize 的話,也會默認采用這種權限過濾器,

但是現在不行了,必須要在每一個 controller 上配置,才能在 swagger 中出現那個 小鎖 的標志,所以我又都在 controller 上,加上了?[Authorize(Permissions.Name)]

如果不配置的話,是沒有小鎖標志,也就不會啟動權限認證的作用的,只有配置了的才有,不僅如此,大家也可以看到,在左側已經把該接口對應的權限也寫上了:

?在netcore 3.0 中,它內置了一個 json 工具—— System.Text.Json,而作為改善 ASP.NET Core 共享框架的工作的一部分,已從 ASP.NET Core 共享框架中刪除Json.NET 。如果你的應用程序使用Newtonsoft.Json特定的功能(如 JsonPatch 或轉換器),或者如果它是特定于格式 Newtonsoft.Json的類型,那我們就需要重新引用它。

簡單來說,就是 3.0 內置了 Text.Json 框架,你可以直接使用,但是我沒有用這個,因為我好像中間出現了一個序列化錯誤,而且我還要取消默認的駝峰命名,所以我還是采用的之前的 Newtonsoft.json,具體的使用方法請看:

1、如果使用 .net core 3.0 內置的 System.Text.Json ,配置方法如下:

services.AddMvc().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});

2、如果使用 Newtonsoft.Json ,配置方法如下:

services.AddControllers()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ContractResolver = new DefaultContractResolver());

這個很簡單,官方中間件取消了? UseSignalR 中間件,而放到了? UseEndpoints 短路中間件中,配置如下:

app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/api2/chatHub");

endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});

?CORS變化其實不大,整體來說和 2.2 一樣的,具體的按照 之前的寫法來寫就行。

只是已經不支持向所有域名開放了,所以下邊的 Policy 可以刪除了,其他的不用變化:

c.AddPolicy("AllRequests", policy =>
{
policy
.AllowAnyOrigin()//允許任何源
.AllowAnyMethod()//允許任何方式
.AllowAnyHeader()//允許任何頭
.AllowCredentials();//允許cookie
});

然后就是要注意中間件的順序,這里記得還要帶上 policy 的名稱 ,還是 app.UseCors("LimitRequests");:

其他補充中

如果你有其他的用到的,是我沒有使用到的, 或者我上文沒有提到的注意點,

歡迎想問提問和反饋,我會在這里,給你署名寫上,讓更多的小伙伴可以學會學號。

謝謝。

https://github.com/anjoy8/Blog.Core

https://gitee.com/laozhangIsPhi/Blog.Core

app.UseStaticFiles(); app.UseRouting(); app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/chat"); endpoints.MapControllerRoute("default",?"{controller=Home}/{action=Index}/{id?}"); });

相關文章:

原文鏈接:https://www.cnblogs.com/laozhang-is-phi/p/11520048.html


.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?

總結

以上是默认站点為你收集整理的最全的 netcore 3.0 升级实战方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得默认站点網站內容還不錯,歡迎將默认站点推薦給好友。