把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析
因为自己到开发电脑转到Mac Air,之前的Webform/MVC应用在Mac 跑不起来,而且.Net Core 2.0 已经比较稳定了。
1. 为什么会有跨平台的.Net Core
近年来,我们已经进入云计算时代,在云平台的PaSS和SaSS上也是发生了大幅度的进化,以docker为代表。微软的Azure平台,google的GAE等等各大云计算厂商都提供了PaSS平台,我们的应用程序要迁移到这样的平台上都需要进行重写。Docker,给云计算带来一场革新,Docker可以被认为是互联网的集装箱,可以灵活地封装软件,令其更快速地传播。这对现代互联网来说是一件大事,因为软件都会运行上成百上千的机器上。Docker可以改变我们开发软件的方式,令每个人都能便捷地利用大量的运算能力。Docker可以让开发者专注于开发软件,不需要考虑在哪里运行自己的软件,这才是云计算的发展方向。开发者考虑应用本身就足够了。
以往的.NET 很难进入以docker为代表的云计算开发平台,特别是Windows不支持Docker,因为那完全是互联网服务的基石--Linux系统才有的技术,微软为了适应这样的云计算潮流,在Windows Server 2016/Windows 10上支持了docker,也重新开发跨平台.NET Core的应用运行平台。
2. 对Old .Neter, 如何尽快熟悉.Net Core 呢?
我们在vs.net 新建一个Empty Core solution, 看看程序入口program.cs,它还是一个console程序. 多引入了4个命名空间. ASP.NET Core应用的寄宿依赖于一个WebHost对象,通过对应的CreateDefaultBuilder的工厂方法创建启动一个WebHost, web服务器. 注册调用了StartUp类. 这个类里面会注册一些中间件.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; namespace sso
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
Startup类里有configureServices和configure方法, 调用顺序是先ConfigureServices后Configure。
这2个的区别是: 其中和Dependecy Injection有关的方法是放在ConfigureServices()中,
Configure()是和Middleware相关的方法
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)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}
默认Empty的solution是只有一个Hello World,我们看一下典型的数据库应用,这个文件会是怎么样的,引入EF,MVC等中间件
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders(); services.AddMvc(); // Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Error");
} app.UseStaticFiles(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
}
如果要引入其他中间件,比如这个,可以参考下面文章.
ASP.NET Core 中间件之压缩、缓存
asp.net core 2.0 查缺补漏
中间件配置主要是用Run
、Map
和Use
方法进行配置,请参考这个文章 ASP.NET Core 运行原理剖析
犯了一个错误,在 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?tabs=aspnetcore2x 这里有提到
Don't call next.Invoke
after the response has been sent to the client. Changes to HttpResponse
after the response has started will throw an exception.
错误代码如下: 这个代码运行时会出错,错误是
该网页无法正常运作
localhost 意外终止了连接。
app.Use(async (context,next) =>
{
context.Response.WriteAsync("Hello World!");
await next();
});
app.Run(async (context)=>
{
await context.Response.WriteAsync("NET Core!");
});
就是说你在中间件里用了Response.Write就不能用Next, 或者说Response.Write 只能用在最后的Use里.
把旧系统迁移到.Net Core 2.0 日记(5) Razor/HtmlHelper/资源文件 |
把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql |
把旧系统迁移到.Net Core 2.0 日记(3) - 详解依赖注入 |
把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog |
把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析的更多相关文章
- 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis
安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...
- 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)
我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...
- 把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题
1. 开发时是在Mac+MySql, 尝试发布时是在SQL2005+Win 2008 (第一版) 在Startup.cs里,数据库连接要改,分页时netcore默认是用offset关键字分页, 如果用 ...
- 把旧系统迁移到.Net Core 2.0 日记(5) Razor/HtmlHelper/资源文件
net core 的layout.cshtml文件有变化, 区分开发环境和非开发环境. 开发环境用的是非压缩的js和css, 正式环境用压缩的js和css <environment includ ...
- 把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql
因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql 数据库迁移时,nvarc ...
- 把旧系统迁移到.Net Core 2.0 日记(3) - 详解依赖注入 (转)
关于DI 依赖注入, 转载这篇文章, 写得很好的. ----------------------------- DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关 ...
- 把旧系统迁移到.Net Core 2.0 日记 (17) --多租户和SoftDelete
在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilter,它出现的意义在哪里?能够解决什么问题呢? 通过HasQueryFilter方法来创建过滤器能够允许我们对访问特定数据库 ...
- 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别
EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...
- 把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog
Net Core 大量使用依赖注入(Dependency Inject), 打个比方,我们常用的日志组件有Log4Net,NLog等等. 如果我们要随时替换日志组件,那么代码中就不能直接引用某个组件的 ...
随机推荐
- 前端性能优化之按需加载(React-router+webpack)
一.什么是按需加载 和异步加载script的目的一样(异步加载script的方法),按需加载/代码切割也可以解决首屏加载的速度. 什么时候需要按需加载 如果是大文件,使用按需加载就十分合适.比如一个近 ...
- 【BZOJ】1085: [SCOI2005]骑士精神
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085 $${if (cs+val-1>ans) return ;}$$ #inclu ...
- win10,配置python3.6,虚拟环境
1.安装python3.6(官网下载) 2.pip install virtualenv(安装虚拟环境) 3.virtualenv TestEnv(创建名为TestEnv的虚拟环境) 4.进入Test ...
- java 四种线程池的异同
四种线程池的区别仅仅在于executors让threadpoolexecutor的构造器的参数不同,即核心线程池数,最大线程池数等不同.但是其他的,例如终止线程池等都是一样的
- Ajax同步
转载自:https://blog.csdn.net/xiegongmiao/article/details/78217386 AJAX中根据async的值不同分为同步(async = false)和异 ...
- 原生ajax的请求封装get和post
一个完整的AJAX请求包括五个步骤: 1.创建XMLHTTPRequest对象 2.使用open方法创建http请求,并设置请求地址 3.设置发送的数据,开始和服务器端交互 4.注册事件 5.获取响应 ...
- CC2 条理分明-----独立思考
独立思考 前几天啊,在吃饭的时候,听到同事们在讨论某幼儿园事件,因为没有人愿意出来作证,所以很可能是造谣.前几天他们还咬牙切齿的指责这个幼儿园,现在怎么就变了.我发现人们的思维变化的太快,我自己也是的 ...
- ajax和iframe区别
ajax和iframe https://segmentfault.com/a/1190000011967786 ajax和iframe的区别 1.都是局部刷新 2.iframe是同步的,而ajax是异 ...
- Getting started with Processing 第七章总结
媒体 如何将文件导入 Processing 中 在 Processing 中,程序是通过应用 data 文件夹中的文件来显示的,这个文件夹可以通过菜单栏中的 Sketch>show sketch ...
- 无法访问SVN历史记录的问题
今天在eclipse中发现无法访问SVN的历史记录,提示条目不可读,截图如下: 用小乌龟客户端试了试也不行,截图如下: 最后解决办法是在SVN服务器上将代码仓库中conf目录下的svnserve. ...