WebApi迁移ASP.NET Core2.0
WebApi迁移ASP.NET Core2.0
一步一步带你做WebApi迁移ASP.NET Core2.0
随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中。我们有必要先说一下ASP.NET Core。
ASP.NET Core 是新一代的 ASP.NET,第一次出现时的代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,这表明它已不是 ASP.NET 的升级,而是一个重新设计的Web开发框架。而它一个非常重要的变化就是它不再依赖于IIS,而是一个独立的自寄宿的控制台应用程序,这也是它可以跨平台的根本。
两个关键词:IIS解耦和独立自寄宿的控制台应用程序。
我们对比一下ASP.NET和ASP.NET Core。ASP.NET 是强依赖于Windows IIS的,因为System.Web 中有很多方法都是直接调用的 IIS相关的 API,同时它还是驻留在IIS进程中的。然而 ASP.NET Core 运行时则是一个完全独立的控制台应用程序,它有自己的 Kestrel Server,可以直接对外部提供服务。不过当前已有的 Kestrel Server 的功能相对比较简单,所以我们还是需要一个反向代理服务器将 Kestrel 服务器保护起来。因此,部署在Linux环境下,可以考虑Nginx+Kestrel Server的组合,Windows环境下,支持和IIS的直接集成(UseIISIntegration),部署在IIS中。
我们进入今天的主题,将原有ASP.NET WebApi工程迁移到ASP.NET Core 2.0.
一、ASP.NET Core WebApi工程
打开VS2017(版本一定要大于15.3),新建项目:ASP.NET Core Web应用程序


新建后的解决方案和工程:

二、ASP.NET Core WebHost构造和运行
大家可以发现,有了Program.cs类,有了Main函数,控制台应用程序就可以运行了。

继续看,构造并启动了一个WebHost. 疑问来了,WebHost是什么机制?如果构造的?
WebHost.CreateDefaultBuilder是在ASP.NET Core 2.0中新增的,在Microsoft.AspNetCore命名空间下。我们看一下CreateDefaultBuilder的源码:

整个WebHost对象的构造过程是这样的:
1. 注册 Kestrel 中间件,指定当前WebHost 要使用的 Server(HTTP服务器)。
2. 设置 Content 根目录,将当前项目的根目录作为 ContentRoot 的目录。
3. 读取 appsettinggs.json 配置文件,开发环境下的 UserSecrets 以及环境变量和命令行参数。
4. 读取配置文件中的 Logging 节点,对日志系统进行配置。
5. 添加 IISIntegration 中间件,集成到IIS中运行。
6. 设置开发环境下, ServiceProvider 的 ValidateScopes 为 true,避免直接在 Configure 方法中获取 Scope 实例。
7. 指定 Startup 类,通过 Build 方法创建 WebHost 对象。
Main函数中,BuildWebHost(args).Run(); 运行创建好的WebHost。
三、调试运行

ValuesController中的Action实现:

四、ASP.NET WebApi迁移评估
在真正迁移ASP.NET WebApi工程之前,我们要评估一下有哪些具体的迁移工作:
- 引用的Nuget和dll迁移
- Web.Config文件迁移
- 自定义WebApi路由迁移
- Controller迁移
- HttpModule扩展迁移
- 各类自定义Attribute迁移
我们服务网关用的WebApi主要涉及上述6个部分,大家可以根据实际情况增加和删除。
五、一步一步迁移ASP.NET Core WebApi
1. 迁移之前首先要建立一个空的ASP.NET Core2.0 WebApi项目:


2. 迁移Controller和Model
在新建的工程中复刻已有的Controller和Model的,例如:

3. 迁移各类Attribute,属性标签,例如:本例中的自定义异常处理标签

4. 迁移Web.Config
为了更好的兼容.NET 原有的配置文件和配置系统。虽然提供了Nuget:
System.Configuration.ConfigurationManager
但是实际上,Web.Config是为了IIS而设计的,在新的ASP.NET Core中推荐使用appSettings.json替换改造。即:将XML化的配置文件修改为JSON配置文件。
核心的NameSpace:Microsoft.Extensions.Configuration
具体可以参考微软的官方资料:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration

配置读取示例:

5. WebApi自定义路由重写
在很多WebApi项目中,采用了自定义路由,例如我们的CommonController,自定义路由在ASP.NET Core2.0中如何支持的呢?
在StartUp类中,提供Configure方法:

在这里,我们加入自定义路由配置,对应我们刚才的CommonController:

6. IHttpModule扩展迁移ASP.NET Core2.0
在ASP.NET Core2.0中提供了中间件的概念,支持请求和响应之间的链式扩展:

具体可以参考微软官方资料:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware
https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules
这里,示例一下我们自己写的自定义中间件:

这里巧妙的通过扩展方法的方式,扩展了接口IApplicationBuilder,
同时在StartUp的Configure方法中加载扩展的自定义中间件:

以上就是我们在将WebApi站点迁移到ASP.NET Core2.0中用到的点滴技术,分享给大家。
周国庆
2017/9/28
WebApi迁移ASP.NET Core2.0的更多相关文章
- 一步一步带你做WebApi迁移ASP.NET Core2.0
随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...
- .Net Core技术研究-WebApi迁移ASP.NET Core2.0
随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...
- VS2017创建一个 ASP.NET Core2.0 应用,并搭建 MVC 框架
https://testerhome.com/topics/11747 1.使用最新版本的VS2017,并安装.NET Core2.0中相关开发工具 2.打开VS2017,点击文件-新建-项目,选 ...
- 【转】Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...
- Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...
- 通过Mysql连接ASP.Net Core2.0(Code First模式)
ASP.NET Core2.0连接Mysql,首先新建项目 选择Web应用程序 选择需要身份验证: 通过Nuget安装Mysql驱动,这里推荐>Pomelo.EntityFrameworkCor ...
- .Net Framework下对Dapper二次封装迁移到.Net Core2.0遇到的问题以及对Dapper的封装介绍
今天成功把.Net Framework下使用Dapper进行封装的ORM成功迁移到.Net Core 2.0上,在迁移的过程中也遇到一些很有意思的问题,值得和大家分享一下.下面我会还原迁移的每一个过程 ...
- Asp.net Core2.0 缓存 MemoryCache 和 Redis
自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ...
- 【翻译】asp.net core2.0中的token认证
原文地址:https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide token ...
随机推荐
- IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体
前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...
- hdu-5792 World is Exploding(容斥+树状数组)
题目链接: World is Exploding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 1135 Is It A Red-Black Tree(30 分)
There is a kind of balanced binary search tree named red-black tree in the data structure. It has th ...
- bzoj1177&p3625 [APIO2009]采油区域p[大力讨论]
我好菜菜啊. 给定矩形,从中选出三个边长K的正方形互不重叠,使得覆盖到的数总和最大. 想的时候往dp上钻去了..结果一开始想了一个错的dp,像这样 /************************* ...
- 【C++ Primer 5th】Chapter 15
摘要: 1. 面向对象程序设计的核心思想是数据抽象.继承和动态绑定.数据抽象将类的接口和实现分离:继承定义相似的类型并对齐相似关系建模:动态绑定,在一定程度上忽略相似类型的区别,而以统一的方式使用它们 ...
- 数据结构与算法(4)----->链表、二分搜索
1. 链表的基本概念 链表和数组一样都是一种线性结构; 数组是一段连续的存储空间; 链表空间不一定保证连续,是临时分配的; 链表的分类 按方向: 单链表:每个节点只能通过next指针指向下一个节点; ...
- 手工创建ASM Disk Groups、为 ASM Disk Groups 添加 disk
Groups 添加 disk 创建语法说明: 必选参数: (1) 指定disk group 的唯一名称 (不分区大小写) (2) 指定disk group 的冗余级别对于ASM 的镜像冗余,可以指定3 ...
- 《TCP/IP详解卷一:协议》 概述
分层 TCP/IP协议族是一组不同层次上的多个协议的组合.TCP/IP通常被认为是一个四层次协议系统. 链路层(数据链路层或网络接口层):通常包括操作系统中的设备驱动程序和计算 ...
- HTTP协议详解之http请求分析
当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We ...
- java Class类
java Class类 Class类(在java.lang包中,Instances of the class Classrepresent classes and interfaces in a ru ...