前言:

这些天,似乎.NET Core相关的新闻和文章经常在我眼前晃~~~

昨天,微软又发布了.Core 2.1,又愰了一下,差点没亮瞎我的眼睛。

好吧,大概是上天给我的暗示,毕竟 CYQ.Data 早就支持上.Core了。

而 Taurus.MVC ,估计也闹委屈了,好吧,大慈大悲的怜见你一回,给你上ASP.NET Core支持吧。

又要一不小心就研究.NET Core了,这东西,只有家里的电脑有VS2017的环境,因此只能在家研究。

中间停停走走,思考了N天,最后用上三十几年的手速,敲足一天一夜代码,终于见到目署光了。

下面先和大伙分享下经验~~~。

Taurus.MVC 如何支持.NET Core?

对于Taurus.MVC,其核心就两个dll项目:

CYQ.Data 已经支持上.NET Core。

就只要处理好 Taurus.Core 项目也支持.NET Core就好了吧。

想想就感觉好简单的样子。

里面的代码,不多,应该不会像当年CYQ.Data支持 .NET Core 那么费心思。

这个从哪弄起好呢~~~~

思考的过程,Taurus.Core项目针对.NET Core重写?

Taurus.Core,和CYQ.Data不同,毕竟Taurus.MVC=CYQ.Data+Taurus.Core:

CYQ.Data 是数据库操作组像,虽然EF强大太多,但毕竟不涉及到程序启动流程。

Taurus.Core,则是从IHttpModule,IHttpHandle为入口开启的自定义MVC世界

建个Demo看看ASP.NET Core的项目:

其启动则是从Program,这不就是一个Exe程序么?

再到Startup:

 public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{ } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{ }

又包含Service服务和一堆Use方式的中件间配置。

网上的文章服务服务的叫,是什么鬼,是操作系统的进程服务吗?

想多了~~~一毛钱关系也没有,人家就是喜欢叫这个名而已。

所以研究的第一个课题就是:传统ASP.NET的启动模式和ASP.NET Core启动模式的差异。

换句话说就是:IHttpModule、IHttpHandler和Startup的不同。

光是这个话题,零散就看了不少文章,中间也隔了不少时间。

经过半桶水的了解后,发现世界有多大,差异就有这么大, 难道只能重写了?

一直关注我博客的好人都知道,我维护的精品框架太多了,见:https://github.com/cyq1162

所以,如果同一个框架,要同时维护两份不同版本的源码(.NET Core版本和非.NET Core版本),我会蛋伤的。

于是,看.NET Core 写兼容代码的时候,内心就会吐槽微软蛋疼,说好的兼容性呢?心中荡漾起那消失已失的草泥马!

后来,心中一个声音,闹腾,太闹腾,放下吧,放下吧~~~~

CYQ.Data 支持.NET Core 方式的余光再次神降

还记得当年:

思考CYQ.Data支持.NET Core的时候,

转展了失眠了无数个白天,

黑夜中左手右手一个慢动作,

经过不断的思考与试验,

最后感动苍天,

神光突降,

最出了最后的解决方案,

非常闪光。

那就是:

把所有不兼容的代码,自己慢慢补全吧,这是一件很费脑的体力活:

所以,当所有的兼容性代码鲁完以后,原有的CYQ.Data 代码一行无变。

只要将这补全的兼容性文件夹包含进项目,马上就神奇般的支持上.NET Core。

 

同理可证:下面看看都有这次又要补全多少所需的兼容性代码!

Taurus.MVC 支持.NET Core的兼容性代码

补全完善:System.Web.HttpContext系列兼容性代码

看起来不少,基本核心的都要补,又是一次费脑的体力活,哥的夜生活,就被你们败光了时间~~~~

在这过程,有过以下不少带坑的问题:

1:在Taurus.MVC Core中,关于是传递Core版本的HttpContext,还是传递Web版HttpContext?

答:用Web版本(让传统得到延续,节省学习成本)

2:对于HttpContext,HttpResponse,HttpRequest ,是用继承,还是不用继承?

答:不用继承,因为无法继承,有些属性名的返回值冲突了。

3:ASP.NET Core目录结构路径和传统的方式的差异性。

答:.NET Core区分执行目录(dll和exe目录)和资源目录(wwwroot),而传统就是一个根目录和bin目录。

4:其它如:文件上传、路径重写、Cookie,编解码等处理。

答:基本是转移了使用的方法位置。

经过很用力的撸,终于解决了上述遇到的问题。

这些重写的源码,已经提交提交了。

可以见:https://github.com/cyq1162/cyqdata/tree/master/DotNetCore

不过以上的重写,都是打包在CYQ.Data Core,

毕竟之前就有一些了,顺路也补多几个,

方便后续对 ASP.NET Aries 的.NET Core版本的支持。

Taurus.Core项目,仅追加了一个中间件文件

看图撸代码:

原有代码一行未动,新增了一个中间件:TaurusMiddleware.cs

中间件的源码,由于未提交,这里先放出来:

using CYQ.Data;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Taurus.Core; namespace Microsoft.AspNetCore.Http
{
/// <summary>
/// 为支持Asp.net core 存在的文件
/// </summary>
public class TaurusMiddleware
{
private readonly RequestDelegate next; public TaurusMiddleware(RequestDelegate next)
{
this.next = next;
} public async Task Invoke(HttpContext context)
{
try
{
System.Web.HttpApplication.Instance.ExecuteEventHandler();
//处理信息
await next(context);
}
catch (Exception ex)
{
Log.WriteLogToTxt(ex);
}
}
}
public static class TaurusExtensions
{
public static IApplicationBuilder UseTaurusMvc(this IApplicationBuilder builder, IHostingEnvironment env)
{
//执行一次,用于注册事件
UrlRewrite url = new UrlRewrite();
url.Init(System.Web.HttpApplication.Instance);
AppConfig.WebRootPath = env.WebRootPath;//设置根目录地址,ASPNETCore的根目录和其它应用不一样。
return builder.UseMiddleware<TaurusMiddleware>();
}
}
}

具体代码是神码意思,就不解释了,了解.NET Core入门的都会懂的。

Taurus.MVC的中间件的使用(提前预告):

在引入CYQ.Data和Taurus.Core(dll或源码项目)后,中间件的引入代码:

添加这三行代码,引入上下文和TaurusMVC后,运行看看效果(截图太美,两张就好):

1:

2:

一切都运行的很完美,当然,这些都是体内精虫的功劳。

总结:

在ASP.NET Core的开发,这条道上:不管是MVC,还是Web API,

微软都是:ASP.NET Core+EF

今天,大伙多了一种选择:Taurus.MVC+CYQ.Data。

后者,在继承跨平台的前提下,保留了传统高性能的模式,节省了学习成本。

正式发布,待整理整理,应该在下周。

PS:好久没写IT连创业系列的文章,不知道大伙还有人知道我在创业不?

Taurus.MVC 支持Asp.Net Core 的过程的更多相关文章

  1. 改造kindeditor支持asp.net core mvc上传文件

    kindtor默认使用的上传方法是使用目录下面的一般处理程序upload_json.ashx,暂时还不支持asp.net core下的文件上传,下面放出的自定义处理上传文件的接口方法. 自定义接收上传 ...

  2. ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core MVC 设计模式 上一章节中,我们提到 ASP.NET Co ...

  3. ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提 ...

  4. ASP.NET CORE 启动过程及源码解读

    在这个特殊的春节,大家想必都在家出不了们,远看已经到了回城里上班的日子,但是因为一只蝙蝠的原因导致我们无法回到工作岗位,大家可能有的在家远程办公,有些在家躺着看书,有的是在家打游戏:在这个特殊无聊的日 ...

  5. ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)

    ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...

  6. IIS发布asp.net mvc项目(asp.net core也是一样)

    因为之前都是利用其他的工具在linux上面进行发布,导致现在忘记了在IIS上面怎么发布,现在就记录下来,以防不时之需吧 第一步: 在vs里面进行项目发布:指定好发布的位置,点击发布就好了 第二步:右击 ...

  7. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

    默认的身份认证好授权系统 UserManager用来操作用户的类, Singi用来身份认证的 添加AccountController 先声明SignInManager和UserManager这两个服务 ...

  8. Asp.Net Core MVC传值 Asp.Net Core API 前台写法

    $("#Add_User").click(function () { var obj = { //"属性名": 传递的值, "User_Name&qu ...

  9. Pro ASP.NET Core MVC 第6版 第一章

    目录 第一章 ASP.NET Core MVC 的前世今生 ASP.NET Core MVC 是一个微软公司开发的Web应用程序开发框架,它结合了MVC架构的高效性和简洁性,敏捷开发的思想和技术和.N ...

随机推荐

  1. STL算法设计理念 - 函数适配器

    1)函数适配器的理论知识 2)常用函数函数适配器 标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象.常用适配器是: 1.绑定器(binder): binder通过把二元函数对象的一个实参 ...

  2. 《java入门第一季》之面向对象(方法重写问题)

    方法重载的引入:根据一个案例: /* 继承中成员方法的关系: A:子类中的方法和父类中的方法声明不一样,这个太简单. B:子类中的方法和父类中的方法声明一样,这个该怎么玩呢? 通过子类对象调用方法: ...

  3. 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章

    菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...

  4. iwms后台出现从客户端(ctl00$cphMain$logo="<img src="pic/logo.g...")中检测到有潜在危险的 Request.Form 值。错误解决方法

    请将 web.config 文件中httpRuntime 配置节中的 requestValidationMode 特性设置为 requestValidationMode="2.0" ...

  5. Github搜索技巧-如何使用github找到自己感兴趣的项目

    Github现在不仅仅作为一个版本控制工具,更是一个开源的仓库,里面不但有优秀的开源代码,电子书,还有一些五花八门的项目,有些国家的法律也放在上面,作为程序员如何找到自己感兴趣的项目就非常重要了! 欢 ...

  6. javascript中的eval函数

    eval()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数.否则会将字符串当成js代码进行编译,如果编译失败则抛出语法错误(SyntaxError)异常.如果编译成功则开始执行这段代码,并 ...

  7. 使用bootstrap table 插件固定表头时 表头与表格内容无法对齐

    在使用bootstrap table开发后台管理系统,表格利用bootstrap-table插件来实现,使用bootstrap-table过程中,会出现表头错位的情况 表头对不齐效果: 解决的方法: ...

  8. 深入浅出理解python 装饰器

    之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.先看下代码: import time # 将函数作为参数传入到此 ...

  9. java finalize方法总结、GC执行finalize的过程

    注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用.问题以及GC执行finalize的过程. 1. finalize的作用 finalize()是Object的protected方法 ...

  10. OpenShift实战(七):OpenShift定制镜像S2I

    1.基础镜像制作 由于公司的程序是Java开发,上线发布使用的是maven,如果使用openshift自带的S2I,每次都会全量拉取代码(代码比较多,每次全量拉太慢),然后每次打包都会再一次下载mav ...