向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. ORA-00600: internal error code, arguments: [6749], [3], [12602196]

    环境信息:Linux5.8 oracle10.2.0.4 问题现象: 现象1:alert日志有大量下面的错误信息: Wed Aug 27 21:01:27 2014Errors in file /u0 ...

  2. X-Forward-For ip

    用 Firefox 的Moify Headers 插件 服务器重新配置X-Forward-For 为正确的值. 如对典型的nginx + php fastcgi 环境( nginx 与 php fas ...

  3. linux网络编程 inet_aton(); inet_aton; inet_addr;

    . inet_aton()是一个改进的方法来将一个字符串IP地址转换为一个32位的网络序列IP地址. . inet_ntoa() 本函数将一个用in参数所表示的Internet地址结构转换成以“.” ...

  4. CF 504 E —— Misha and LCP on Tree —— 树剖+后缀数组

    题目:http://codeforces.com/contest/504/problem/E 快速查询LCP,可以用后缀数组,但树上的字符串不是一个序列: 所以考虑转化成序列—— dfs 序! 普通的 ...

  5. Jasper:目录/资源

    ylbtech-Jasper:目录/资源 1. 官网返回顶部 1. https://www.jasper.com/ 2. 2.返回顶部 1. http://api.jasperwireless.com ...

  6. java递归demo---

    递归思想: 递归就是方法里调用自身 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口 递归算法代码显得很简洁,但递归算法解题的运行效率较低.所以不提倡用递归设计程序. 在递归调用的过程中系 ...

  7. QT时钟绘制

    Demo的效果 资源占用还能接受 运行久一点内存就下去了 下面是Demo的代码 #include "mainwindow.h" #include "ui_mainwind ...

  8. Spring入门第十九课

    后置通知 看代码: package logan.study.aop.impl; public interface ArithmeticCalculator { int add(int i, int j ...

  9. eval解析字符串问题

    eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句. 复制代码 var str = '{"name&quo ...

  10. swfupload原理总结

    1.引入js(js内动态添加上传的文件并提交表单) 2.后台处理(将图片保存) 3.调用另一个js修改前台图片的地址(改为新的图片地址)