向ASP.NET Core迁移

 

有人说.NET在国内的氛围越来越不行了,看博客园文章的浏览量也起不来。是不是要转Java呢? 没有必要扯起语言的纷争,Java也好C#都只是语言是工具,各有各的使用场景。以前是C#非开源以及不能在Linux上使用,没有被互联网公司考虑,但它仍然有它的用途。这几年国内互联网公司进入蓬勃发展时期,所有才有这样的趋势。但并不代表C#不能做互联网应用,可以说在接下来的一年内.net core将会成为一个很好的趋势,结合容器以及微服务架构会成为互联网公司另一个比较好的选择。

作为现在在用.NET的公司,如果有机会可以考虑与时俱进,在真实项目中将.net core用起来。作为开发者,我们不能等着这个语言好了再去学习,那时候机会已经给那些先头部队给抢了。 :) 你们都知道我在说什么。

欢迎大家加入我建和ASP.NET Core学习群: qq: 92436737

我们首先来看看ASP.NET Core有哪些优势?

  1. 跨平台:可以部署到Linux服务器上
  2. 内置一套对云和部署环境非常友好的配置模块
  3. 内置依赖注入
  4. IIS或者Kestrel(或者其它自定义)
  5. 轻量级、高性能、模块化的Http处理管线
  6. .NET Core 是开源的,并且基于nuget发布。 这让我们有了更大的空间去改造和扩展它
  7. 更易于现代化的项目开发,比如面向容器,微服务架构,对DevOps更友好

公司的决策层为什么要做这样的选择?
  1. 降低成本,提升效率
  2. 提升公司的技术品牌
  3. 更好的留住和培养现有的开发团队,以及招募到更好的开发者
 
在同等用户规模的情况下,选择 Linux的服务器比Windows Server的性价比更高。在一个产品的整个实现与运营生命周期当中,编码只占了很小的一部分,还有开发与测试环境的初始化与维护,测试与集成,线上环境部署与运维这都会占用不少的时间,通过自动化可以大幅度的减少这些时间。而在.NET Core实现跨平台之后,让自动化的门槛降到最低。你不再需要一个资深的架构师或者专业的DevOps才可以实现,一个有经验肯学习的开发者足以应付。
 

如何来做升级和改造 ?

 
 说到真实产品的技术升级和改造,不伤筋动骨,不可能完成。
  1. 老系统是 asp.net Web Form
  2. 老系统用的是WCF之类的项目
  3. 老系统是asp.net MVC或者WEB API

由于对system.web的重依懒,将Web Form迁移到ASP.NET Core几乎是不可能。如果Web Form项目使用了服务器端控件,那已经可以放弃往下走,可以尝试开始一个新的项目逐步替换老的项目。如果没有使用服务器端控件,用handller在返回数据,则可以考虑先将Web Form的项目进行前后端分离或者API 分离,在视图层逻辑不变的情况下重写后端逻辑部分。当然这个代价也不小,所以转型和升级需要准备的事情有很多。

WCF暂时还不能支持.NET Core,虽然微软已经启动WCF的开源和并入.NET基金会,但短时间内WCF迁移到.NET Core还有一段时间。所以如果对WCF依懒比较重,最好暂时不要考虑升级。一些复杂的MVC和WEB API的项目如果依懒比较多,要升级起来也不是一件容易的事情 。目前比较可行的方案,还是在新项目上使用.NET Core来实现 。

最合适的步骤是先在一些新的项目上采用ASP.NET Core来开发。就语言特性本身来说ASP.NET Core的变化不大,学习成本也不高。但是生产环境不是随便玩的,要从无到有,过程比较艰难,这也是很多小公司到现在还没有在生产上用上.NET Core人原因之一。只有开发人员干着急,我们什么用.NET Core 呢?

与其等待你的总监做这个决定,不如自己先干起来。如果不能从无到有,那么我们可以在原来的系统上换部件:也就是我们的最小升级方案,将.NET Core部署在IIS上。

最小升级方案:将ASP.NET Core部署在IIS上

关于如何把ASP.NET Core的网站或者API部署到IIS上,网上已经有比较多的介绍,可以参考这里。主要是需要先下载一个ASP.NET Core的模块安装之后再进行简单的配置,新手比较容易忽略。如果你的IIS模块里面没有AspNetCoreModule,说明没有安装这个ASP.NET Core模块,需要进行下载安装。

 
ASP.NET Core所有的项目都必须运行在Kestrel或者一个自定义的Web Server上。
 
在asp.net core 2.0时,采用默认的  WebHost.CreateDefaultBuilder().Builder() 得到的Host已将将 Kestrel和IISIntegration都添加进来。
public static void Main(string[] args){
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, 5000);
options.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
})
.UseIISIntegration()
.Build()
}

IISIntegration其实是将IIS做一个反向代理,AspNetCoreModule的任务就是将请求转发给Kestrel。

当然你也可以选择用Nginx或者 Apache来做反向代理,来实现ASP.NET Core在Linux上的部署。这里有一篇不错的实践贴(将ASP.NET Core应用程序部署至生产环境中(CentOS7)

在我们的最小升级方案里面,部署到IIS是在生产环境中使用ASP.NET Core是最易实现和成本最低的一种。剩下的,等开发人员对ASP.NET Core掌握的比较牢固,对Linux的运维也有一些经验之后可以再尝试往Linux上迁移。

 

新老项目交互的问题

除了刚起步没有任何历史负担的公司,我们大多数所在的公司都处于老系统维护和新系统开发并行的情况。在新系统的开发过程当中,少不了要与老系统打交道。比如最常用的一些其它系统的数据访问,就会面临是重写好,还是调用老系统中的代码比较好的问题。

这里没有明确的答案,取绝于当前业务的发展和我们所拥有的时间来决定 。人和时间够整个系统重写都可以,不够的话我们也只能采用系统嫁接的方式。

根据老系统的结构主要分两种:

  1. 前后端未分离,就是一个大的网站
  2. 前后端已分离,前端和移动端直接调用ASP.NET Web API

第一种情况会给系统以及开发增加的复杂度是: 本地代码访问变成API访问之后的引发的问题,这也是多数团队在做服务化时首先遇到的问题。
  • 增加额外的API访问代码
  • 增加Debug的复杂度,不好找原因
第二种情况,已经API化只是没有做拆分。那我们新写的ASP.NET Core API 可以直接被访问。这里的问题是要解决认证授权的问题包括(从客户端到Core API,以及从Core API到原来的Web API)

注:这种方案应该禁止从老的ASP.NET Web API访问 ASP.NET Core的项目。最后应该是停止维护老项目,所有代码在新的ASP.NET Core上进行开发。 Proxy的设计应该按照新的框架来设计,实现可以嫁接老的API,做好被新代码替换掉的准备。

 
关于ASP.NET Core认证与授权相关可以参考我写的另外一篇文章 ASP.NET Core集成现有系统授权 : ASP.NET Core集成现有系统认证
 
本文首发于公众号jessetalk,如需转载请保留公众号二维码。
 
ASP.NET Core依赖注入全知道: https://mp.weixin.qq.com/s/lR9O7bXiI704kSu7bKdLGg
我心中的ASP.NET Core新核心对象之WebHost(一) https://mp.weixin.qq.com/s/4Sm2dxMe_WeVOizhqX4ZdA
极简版ASP .NET Core学习路径  https://mp.weixin.qq.com/s/7oKnYLOrff_FmMLm7thnBg
 
作者:Jesse 出处:http://jesse2013.cnblogs.com/

NET Core迁移的更多相关文章

  1. .Net Core迁移到MSBuild平台(二)

    一.前言 在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下新的项目配置文件中的节点配置,这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程 ...

  2. EntityFramework Core迁移时出现数据库已存在对象问题解决方案

    前言 刚开始接触EF Core时本着探索的精神去搞,搞着搞着发现出问题了,后来就一直没解决,觉得很是不爽,借着周末好好看看这块内容. EntityFramework Core迁移出现对象在数据库中已存 ...

  3. EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    前言 终于踏出第一步探索EF Core原理和本质,过程虽然比较漫长且枯燥乏味还得反复论证,其中滋味自知,EF Core的强大想必不用我再过多废话,有时候我们是否思考过背后到底做了些什么,到底怎么实现的 ...

  4. Net Core迁移到MSBuild

    Net Core迁移到MSBuild平台(二)   阅读目录 一.前言 二.XML定义 三.结语 回到目录 一.前言 在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下 ...

  5. Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    Cookies   1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...

  6. .net core迁移实践:项目文件csproj的转换

    随着net core的不断更新和生产可用,越来越多的人把现有的应用迁移和部署到net core平台.本文将分享迁移过程中的一个环节,给大家做一下参考. 背景说明 先来介绍一下什么是SDK样式的文件结构 ...

  7. 新的ASP.NET Core 迁移指南

    最近在微信里做了一个调查: Web Forms应用程序升级到.NET 6, 收到550份调查,调查还在继续,欢迎参与调查.可以访问链接:https://wj.qq.com/s2/9822949/ac3 ...

  8. 浅谈 EF CORE 迁移和实例化的几种方式

    出于学习和测试的简单需要,使用 Console 来作为 EF CORE 的承载程序是最合适不过的.今天笔者就将平时的几种使用方式总结成文,以供参考,同时也是给本人一个温故知新的机会.因为没有一个完整的 ...

  9. .NET Core迁移技巧之web.config配置文件

    大家都知道.NET Core现在不再支持原来的web.config配置文件了,取而代之的是json或xml配置文件.官方推荐的项目配置方式是使用appsettings.json配置文件,这对现有一些重 ...

随机推荐

  1. 分享知识-快乐自己:Oracle 创建序列 及 使用序列

    1.创建序列语法: create sequence 序列名 [可选参数] 序列名常定义为‘seq_XXX’的形式,创建序列不能使用replace 可选参数说明: increment by: 序列每次增 ...

  2. 搭建LoadRunner中的场景(三)场景的执行计划

    所谓场景操作,包括初始化用户组.启动用户组各用户以及停止虚拟用户的全过程.依据设置不同,执行过程中可以最多有5类操作,分别是启动用户组(start group).初始化(Initialize).启动虚 ...

  3. ubuntu的root权限设置

    Linux操作系统有root权限用户和普通权限用户两种模式. 在执行一些需要权限才能执行的任务时,我们需要转化到root权限用户条件下才能执行. 1.普通用户权限转临时root权限: Linux中,通 ...

  4. 文件操作:os模块与os.path模块

    一.os与os.path 原创:http://www.cnblogs.com/lovemo1314/archive/2010/11/08/1871781.html os模块用于处理文件及文件夹,包括文 ...

  5. mysql修改初始密码

    通过MySQL命令行,可以修改MySQL数据库的密码,下面就为您详细介绍该MySQL命令行,如果您感兴趣的话,不妨一看. 格式:mysqladmin -u用户名 -p旧密码 password 新密码 ...

  6. ACM学习历程—Hihocoder 1164 随机斐波那契(数学递推)

    时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 大家对斐波那契数列想必都很熟悉: a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1). ...

  7. bzoj 4310 跳蚤 —— 后缀数组+二分答案+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分 ...

  8. zk 01之 ZooKeeper概述

    Zookeeper产生的背景 ZooKeeper---译名为“动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的 ...

  9. 五 Vue学习 首页学习 (上)

    首页:   http://localhost:8002/#/,  登录页面如下: index.js文件中如下的路由配置,转过去看login.vue是如何实现的. const routes = [ { ...

  10. H+ Se7en WebUI

    http://www.zi-han.net/theme/hplus/webim.html