前言:

这些天,似乎.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. JAVA DOM4j解析XML数据到自定义javabean

    我们获取xml中的数据,一般以面向对象的思想去处理这些数据.因此,我们需要自定义类来封装解析出来的数据,以方便我们操作这些数据. 自定义的java类,称为javabean. 自定义Contact类代码 ...

  2. android:background="@color/white" [create file color.xml at res/values/]

     <resources><color name="white">#FFFFFF</color><!--白色 --><col ...

  3. 基于Struts+Hibernate开发过程中遇到的错误

    1.import  javax.servlet.http.HttpServletRequest 导入包出错 导入包出错,通常是包未引入,HttpServletRequest包是浏览器通过http发出的 ...

  4. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十九):增加排行榜功能2

    接下来回到Xcode中,首先在PopupLayer.m中添加justClose方法: -(void)justClose{ [self.gameScene removePopup]; } 然后在Game ...

  5. How to Simulate the Price Order or Price Line Function using API QP_PREQ_PUB.PRICE_REQUEST Includes

    How to Simulate the Price Order or Price Line Function using API QP_PREQ_PUB.PRICE_REQUEST Includes ...

  6. DOS窗口如何实现复制粘贴

    最近很多时候直接ctrl+c和ctrl+v无法实现DOS中的复制与粘贴,自己输入很麻烦.就要选择其他方式.查找资源后,总结如下: 方法一:第一种方式:右键标记-->选中-->标题栏右键编辑 ...

  7. 【Python】模拟radius coa报文

    Radius协议中网关设备NAS是client,实现radius协议的服务为服务端(例如freeradius),这种情况下radius server并不能主动给NAS发送信息.在 rfc3576 Dy ...

  8. RPi Kernel Compilation

    Overview This page explains how to rebuild the kernel image for the RPi. There are two possible rout ...

  9. Android ROM开发(三)——精简官方ROM并且内置ROOT权限,开启Romer之路

    Android ROM开发(三)--精简官方ROM并且内置ROOT权限,开启Romer之路 相信ROM的相关信息大家通过前几篇的学习都是有所了解了,这里就不在一一提示了,这里我们下载一个官方包,我们还 ...

  10. 拆轮子之Fish动画分析

    概述 最近发现一个很好玩的动画库,纯代码实现的而不是通过图片叠加唬人的,觉得很有意思看了下源码https://github.com/dinuscxj/LoadingDrawable, 这个动画效果使用 ...