asp.net core 3.0 更新简记

Intro

最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0,记录一下,升级踩过的坑以及经验总结,包括但不限于

  • TargetFramework ( netcoreapp2.2 需要更新为 netcoreapp3.0)

  • Dependency

  • Host/Environment

  • Mvc

  • Routing

  • Swagger

  • Dockerfile

  • EF(不推荐更新)

TargetFramework 更新

原来项目里的 netcoreapp2.x 版本需要更新为 netcoreapp3.0,原来有些基于 netstandard2.0 的项目的包如果有包更新之后依赖 netstandard2.1 可能需要更新为 netstandard2.1(非必须,看项目依赖)

Dependency

原来在 dotnetcore 2.x 版本时大部分的包以 nuget 的形式提供,可以直接通过 nuget 引用,从 dotnetcore 3.0 开始很多包不再发布 nuget 包,需要通过框架引用来引用包( FrameworkReference)

比如在一个类库项目 <ProjectSdk="Microsoft.NET.Sdk"> 里有这么一个引用 <PackageReferenceInclude="Microsoft.AspNetCore.Mvc.Core"Version="2.2.2"/>,在 dotnetcore 3.0 并没有发布对应的 nuget 包,需要使用框架引用,示例如下:

<FrameworkReference Include="Microsoft.AspNetCore.App" />

如果是 Web 项目 <ProjectSdk="Microsoft.NET.Sdk.Web">,Sdk 是 Web 的话直接把 targetFramework 更新的 netcoreapp3.0 就可以了,不需要再添加上面的引用了,项目里 <PackageReferenceInclude="Microsoft.AspNetCore.App"/> 的引用也可以直接移除了

Host && Environment

原来的 IHostingEnvironment 改为了 IWebHostEnvironment,原来注入 IHostingEnvironment 的地方需要修改为注入 IWebHostEnvironment

原来 Program 里使用的 WebHostBuilder 改为 HostBuilder 并配置 `ConfigureWebHostDefaults `,变更如下:

MVC

服务注册

3.0 里 MVC 对 ControllerRazorPages 以及 RazorViews 整理,注入服务的时候我们可以只注入自己需要的服务,如果是 WebAPI 项目可以只添加 Controller 需要的服务即可,对应的添加方式:

services.AddControllers(); // WebAPI
services.AddControllersWithViews(); // MVC
services.AddRazorPages(); // RazorPage

JSON 配置

asp.net core 3.0 默认使用微软新的 JSON,但是推荐还是用 Newtonsoft.Json,比较成熟而且对很多比较特殊的情况都有处理,已然成为了.NET 里 JSON 序列化的事实标准,使用方式如下:

  1. 引用 nuget 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson

  2. 配置使用 Newtonsoft.Json

services.AddControllersWithViews()    .AddNewtonsoftJson(options =>   {   options.SerializerSettings.ContractResolver = new DefaultContractResolver();   options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; // 设置时区为 UTC   });

Rounting

asp.net core 3.0 推荐使用 endpoint rounting

配置方式如下:

           app.UseStaticFiles(); app.UseSwagger()    .UseSwaggerUI(c =>  {   // c.RoutePrefix = string.Empty; //    c.SwaggerEndpoint($"/swagger/{ApplicationHelper.ApplicationName}/swagger.json", "活动室预约系统 API"); c.DocumentTitle = "活动室预约系统 API"; }); app.UseRouting(); // 放在 UseStaticFiles 之后   app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()); app.UseRequestLog();    app.UsePerformanceLog();    app.UseAuthentication();    app.UseAuthorization(); // 放在 UseAuthentication 之后  app.UseEndpoints(endpoints =>   {   endpoints.MapControllers(); // 属性路由 endpoints.MapControllerRoute("Notice", "/Notice/{path}.html", new   {   controller = "Home", action = "NoticeDetails" }); // 自定义路由    endpoints.MapControllerRoute(name: "areaRoute", "{area:exists}/{controller=Home}/{action=Index}"); // 区域路由    endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); // 默认路由    });

Swagger

更新 swagger 依赖到最新的 5.0.0-rc-x 版本(还没发稳定版,需要显示预览版本才能看到)

services.AddSwaggerGen(options =>
{   options.SwaggerDoc(ApplicationHelper.ApplicationName, new Microsoft.OpenApi.Models.OpenApiInfo { Title = "活动室预约系统 API", Version = "1.0" });   options.IncludeXmlComments(System.IO.Path.Combine(AppContext.BaseDirectory, $"{typeof(Models.Notice).Assembly.GetName().Name}.xml")); options.IncludeXmlComments(System.IO.Path.Combine(AppContext.BaseDirectory, $"{typeof(API.NoticeController).Assembly.GetName().Name}.xml"), true);
});

这里没有用到 OperationFilter,如果用到了 OperationFilter,可能需要引入 Swashbuckle.AspNetCore.Filters 这个包,详细参考:https://www.cnblogs.com/laozhang-is-phi/p/11520048.html#autoid-6-0-0

Docker

Dockerfile 里基础镜像需要更新到 3.0

示例 dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-alpine AS build-env
WORKDIR /src
# Copy csproj and restore as distinct layers
COPY ActivityReservation.Common/*.csproj ActivityReservation.Common/
COPY ActivityReservation.Models/*.csproj ActivityReservation.Models/
COPY ActivityReservation.DataAccess/*.csproj ActivityReservation.DataAccess/
COPY ActivityReservation.Business/*.csproj ActivityReservation.Business/
COPY ActivityReservation.Helper/*.csproj ActivityReservation.Helper/
COPY ActivityReservation.WechatAPI/*.csproj ActivityReservation.WechatAPI/
COPY ActivityReservation.AdminLogic/*.csproj ActivityReservation.AdminLogic/
COPY ActivityReservation.API/*.csproj ActivityReservation.API/
COPY ActivityReservation/ActivityReservation.csproj ActivityReservation/
# RUN dotnet restore ActivityReservation/ActivityReservation.csproj
## diff between netcore2.2 and netcore3.0
WORKDIR /src/ActivityReservation
RUN dotnet restore
# copy everything and build
COPY . .
RUN dotnet publish -c Release -o out ActivityReservation/ActivityReservation.csproj
# build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine
LABEL Maintainer="WeihanLi"
WORKDIR /app
COPY --from=build-env /src/ActivityReservation/out .
EXPOSE 80
ENTRYPOINT ["dotnet", "ActivityReservation.dll"]

修改基础镜像一般不会有什么问题,需要注意的是如果 dockerfile 里有用到 dotnet publish 且publish 的项目不在当前目录下,可能会遇到这样的问题,最后找不到要发布的文件。

dotnet core 3.0 cli 有个 breaking change,如果要发布的项目不在当前目录下,在 2.x 版本是会发布到项目文件所在目录下的,但是 3.0 版本会发布在当前目录下,比如说执行 dotnet publish-cRelease./src/ActivityReservation.csproj-oout命令:

2.x版本会在 src目录下生成一个 out 文件夹

3.0 版本会在当前目录下生成一个 out 文件夹, out文件夹和 src 同级

详细问题可以参考 https://github.com/dotnet/cli/issues/12696

EF

EF Core 3.0 和 asp.net core 3.0 完全独立,可以在 asp.net core 3.0 的项目里使用 2.x 的 EF Core

EF Core 3.0 有个 breaking change,不再隐式支持客户端渲染数据,这可以让你更清晰的知道哪些条件和在数据库执行的哪些条件是在本地执行的,但是实际试用下来,还是有很多问题的,在 EF 的基础上封装了一层,使用表达式树来拼接查询条件,但是最后执行的时候会有问题,但是简化后的条件实际上并不会在客户端执行任何过滤操作,所以暂时不推荐试用 ef core 3.0,而且更新之后可能会遇到其他的问题,详见issue https://github.com/aspnet/EntityFrameworkCore/issues/18025

现在的项目使用 ef core2.1 + asp.net core3.0 运行

More

其他的地方应该也有需要修改的地方,欢迎补充

Reference

  • https://www.cnblogs.com/stulzq/p/11497624.html

  • https://www.cnblogs.com/laozhang-is-phi/p/11520048.html

  • https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio

  • https://github.com/WeihanLi/ActivityReservation/pull/28/files

asp.net core 3.0 更新简记相关推荐

  1. ASP.NET Core 1.0 开发记录

    ASP.NET Core 1.0 更新比较快(可能后面更新就不大了),阅读注意时间节点,这篇博文主要记录用 ASP.NET Core 1.0 开发简单应用项目的一些记录,以备查阅. ASP.NET C ...

  2. .NET Core 3.0预览版7中的ASP.NET Core和Blazor更新

    .NET Core 3.0 Preview 7现已推出,它包含一系列ASP.NET Core和Blazor的新更新. 以下是此预览中的新功能列表: 最新的Visual Studio预览包括.NET C ...

  3. Amazing ASP.NET Core 2.0

    前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着 ...

  4. .NET Core ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

  5. diskgeniusv4.4.0_.NET Core 3.0及ASP.NET Core 3.0前瞻

    (给DotNet加星标,提升.Net技能) 转自:LineZerocnblogs.com/linezero/p/netcore3 前几天微软发布了< .NET Core 3.0 Preview ...

  6. [译]ASP.NET Core 2.0 机密配置项

    问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...

  7. Centos7 Docker Jenkins ASP.NET Core 2.0 自动化发布和部署

    写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级 ...

  8. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (1)

    工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...

  9. ASP.NET Core 6.0对热重载的支持

    .NET 热重载技术支持将代码更改(包括对样式表的更改)实时应用到正在运行的程序中,不需要重启应用,也不会丢失应用状态. 一.整体介绍 目前 ASP.NET Core 6.0 项目都支持热重载.在以下 ...

最新文章

  1. 兄弟连html5在线画板,IT兄弟连 HTML5教程 HTML5做到了与之前版本的兼容
  2. 集成学习(期末复习)
  3. UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)
  4. React基础篇(六)React中绑定事件的注意点
  5. 解决gvim中php函数提示php_funclist.dict无法生效的问题
  6. Yearn已部署新YFI策略Brownie Mix
  7. 操作系统——进程与线程
  8. 查询oracle 表记录数,Oracle 查询所有表的记录数
  9. spring security 注解_Spring框架使用@Autowired自动装配引发的讨论
  10. 使用 rtcwake 定时唤醒休眠的linux
  11. http抓包实践--(五)-常用的操作
  12. matlab直线的程序,MATLAB|辅助直线绘制程序
  13. IT服务台方案:提供完整的业务流程视图
  14. 小米社招java面经_小米Java实习一面面经(凉)
  15. HashMap线程安全问题详细解析
  16. Junit新语法assertThat
  17. 国家标准计算机软件测试文档范文,软件测试相关国家标准.doc
  18. 炉石胖枫抽到什么刀片服务器准系统整机主板,中速猎天下第一!老将胖枫喜提炉石传说青岛黄金赛大师组冠军...
  19. 19年NAACL纪实:自然语言处理的实用性见解
  20. 最高检发布破坏计算机信息系统案等六大指导性案例

热门文章

  1. 二叉查找树转换成有序的双向链表
  2. 谷歌浏览器的翻译功能在哪_如何在Google表格中使用AND和OR功能
  3. java发送gmail_如何在Gmail中轻松通过电子邮件发送人群
  4. SAP的SqlAnyWhere中数据库日志文件删除后如何新建
  5. 使用原生js写ajax
  6. 网规:第4章 网络安全-4.5IDS和IPS
  7. 在SQLSERVER企业管理器中如何创建触发器
  8. 如何优雅地处理 EF Core 异常
  9. Avalonia跨平台入门第六篇之Grid动态分割
  10. HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...