因为自己到开发电脑转到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 查缺补漏
中间件配置主要是用RunMapUse方法进行配置,请参考这个文章  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 意外终止了连接。

ERR_INCOMPLETE_CHUNKED_ENCODING
            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 日记 (15) --Session 改用Redis
 把旧系统迁移到.Net Core 2.0 日记 (13) --图形验证码
把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题
把旧系统迁移到.Net Core 2.0 日记(11) -- Authentication 认证 claimsIdentity 对比 之前的FormAuthentication
把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别
把旧系统迁移到.Net Core 2.0 日记(9) -- T4 Template
把旧系统迁移到.Net Core 2.0 日记(8) - EASYUI datagrid
把旧系统迁移到.Net Core 2.0 日记(7) Tag Helpers /ResponseCache
把旧系统迁移到.Net Core 2.0 日记(6) MapRoute/Area/ViewPath
把旧系统迁移到.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 解析的更多相关文章

  1. 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...

  2. 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  3. 把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题

    1. 开发时是在Mac+MySql, 尝试发布时是在SQL2005+Win 2008 (第一版) 在Startup.cs里,数据库连接要改,分页时netcore默认是用offset关键字分页, 如果用 ...

  4. 把旧系统迁移到.Net Core 2.0 日记(5) Razor/HtmlHelper/资源文件

    net core 的layout.cshtml文件有变化, 区分开发环境和非开发环境. 开发环境用的是非压缩的js和css, 正式环境用压缩的js和css <environment includ ...

  5. 把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql

    因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql 数据库迁移时,nvarc ...

  6. 把旧系统迁移到.Net Core 2.0 日记(3) - 详解依赖注入 (转)

    关于DI 依赖注入, 转载这篇文章, 写得很好的. ----------------------------- DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关 ...

  7. 把旧系统迁移到.Net Core 2.0 日记 (17) --多租户和SoftDelete

    在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilter,它出现的意义在哪里?能够解决什么问题呢? 通过HasQueryFilter方法来创建过滤器能够允许我们对访问特定数据库 ...

  8. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

  9. 把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog

    Net Core 大量使用依赖注入(Dependency Inject), 打个比方,我们常用的日志组件有Log4Net,NLog等等. 如果我们要随时替换日志组件,那么代码中就不能直接引用某个组件的 ...

随机推荐

  1. 理解 Redis(4) - 关于 string 的更多命令(SETEX, SETNX, INCR, DECR, MSET...)

    上一节介绍了关于字符串值的一些基本命令, 这一节将介绍一些进阶命令: 清理终端: 127.0.0.1:6379> clear 设置一个键值对, 同时设置过期时间为10秒: 127.0.0.1:6 ...

  2. _itemmod_extract_enchant

    comment 备注 entry 物品ID CanExtract 1 - 可提取随机FM 0 - 不可提取随机FM,当CanExtract = 1 且有随机FM效果时,随机FM效果会被提取 CanEn ...

  3. selenium 在电脑浏览器中用手机模式打开

    import requests from selenium import webdriver from selenium.webdriver.common.action_chains import A ...

  4. IIS上部署MVC网站,打开后ExtensionlessUrlHandler-4.0

    IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误 IS上部署MVC网站,打开后Extensio ...

  5. 使用bat文件执行sql文件

    test.bat mysql -uroot -p[password] < test.sql pause test.sql CREATE DATABASE IF NOT EXISTS test_d ...

  6. MySQL的正则表达式的LIKE和REGEXP区别

    LIKE匹配整个列.如果被匹配的文本在列值 中出现,LIKE将不会找到它,相应的行也不被返回(除非使用 通配符).而REGEXP在列值内进行匹配,如果被匹配的文本在 列值中出现,REGEXP将会找到它 ...

  7. 学习笔记21—PS换图片背景

    将照片红底的换成白底的. 操作步骤: 1 先上效果,照片来自网络反正不认识,法律问题找度娘 2 下面开始操作,打开图片进入通道面板,选择照片底色的那个通道,复制并调整色阶,确保黑白分明 3 回到图层面 ...

  8. ssh连接docker镜像ubuntu与debian

    用密码登录root docker官网给的sshdemo是ubuntu的,https://docs.docker.com/engine/examples/running_ssh_service/   亲 ...

  9. SPOJ 刷题记录

    按点赞数降序 297 二分 #include<bits/stdc++.h> using namespace std; #define fi first #define se second ...

  10. Codeforces 934C - A Twisty Movement

    934C - A Twisty Movement 思路:dp 很容易想到要预处理出1的前缀和pre[i]和2的后缀和suf[i] 然后枚举区间,对于每个区间如果能求出最长递减序列的长度,那么就能更新答 ...