把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析
因?yàn)樽约旱介_(kāi)發(fā)電腦轉(zhuǎn)到Mac Air,之前的Webform/MVC應(yīng)用在Mac 跑不起來(lái),而且.Net Core 2.0 已經(jīng)比較穩(wěn)定了。
1. 為什么會(huì)有跨平臺(tái)的.Net Core?
近年來(lái),我們已經(jīng)進(jìn)入云計(jì)算時(shí)代,在云平臺(tái)的PaSS和SaSS上也是發(fā)生了大幅度的進(jìn)化,以docker為代表。微軟的Azure平臺(tái),google的GAE等等各大云計(jì)算廠商都提供了PaSS平臺(tái),我們的應(yīng)用程序要遷移到這樣的平臺(tái)上都需要進(jìn)行重寫(xiě)。Docker,給云計(jì)算帶來(lái)一場(chǎng)革新,Docker可以被認(rèn)為是互聯(lián)網(wǎng)的集裝箱,可以靈活地封裝軟件,令其更快速地傳播。這對(duì)現(xiàn)代互聯(lián)網(wǎng)來(lái)說(shuō)是一件大事,因?yàn)檐浖紩?huì)運(yùn)行上成百上千的機(jī)器上。Docker可以改變我們開(kāi)發(fā)軟件的方式,令每個(gè)人都能便捷地利用大量的運(yùn)算能力。Docker可以讓開(kāi)發(fā)者專注于開(kāi)發(fā)軟件,不需要考慮在哪里運(yùn)行自己的軟件,這才是云計(jì)算的發(fā)展方向。開(kāi)發(fā)者考慮應(yīng)用本身就足夠了。
以往的.NET 很難進(jìn)入以docker為代表的云計(jì)算開(kāi)發(fā)平臺(tái),特別是Windows不支持Docker,因?yàn)槟峭耆腔ヂ?lián)網(wǎng)服務(wù)的基石--Linux系統(tǒng)才有的技術(shù),微軟為了適應(yīng)這樣的云計(jì)算潮流,在Windows Server 2016/Windows 10上支持了docker,也重新開(kāi)發(fā)跨平臺(tái).NET Core的應(yīng)用運(yùn)行平臺(tái)。
2. 對(duì)Old .Neter, 如何盡快熟悉.Net Core 呢?
我們?cè)趘s.net 新建一個(gè)Empty Core solution, 看看程序入口program.cs,它還是一個(gè)console程序. 多引入了4個(gè)命名空間. ASP.NET Core應(yīng)用的寄宿依賴于一個(gè)WebHost對(duì)象,通過(guò)對(duì)應(yīng)的CreateDefaultBuilder的工廠方法創(chuàng)建啟動(dòng)一個(gè)WebHost, web服務(wù)器. 注冊(cè)調(diào)用了StartUp類. 這個(gè)類里面會(huì)注冊(cè)一些中間件.
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方法,?調(diào)用順序是先ConfigureServices后Configure。
這2個(gè)的區(qū)別是:?其中和Dependecy Injection有關(guān)的方法是放在ConfigureServices()中,
Configure()是和Middleware相關(guān)的方法
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!");
? ? ? ? ? ? });
? ? ? ? }
? ? }
默認(rèn)Empty的solution是只有一個(gè)Hello World,我們看一下典型的數(shù)據(jù)庫(kù)應(yīng)用,這個(gè)文件會(huì)是怎么樣的,引入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?}");
? ? });
}
如果要引入其他中間件,比如這個(gè),可以參考下面文章.
ASP.NET Core 中間件之壓縮、緩存
asp.net core 2.0 查缺補(bǔ)漏
中間件配置主要是用Run、Map和Use方法進(jìn)行配置,請(qǐng)參考這個(gè)文章??ASP.NET Core 運(yùn)行原理剖析
?犯了一個(gè)錯(cuò)誤,在?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.
錯(cuò)誤代碼如下: 這個(gè)代碼運(yùn)行時(shí)會(huì)出錯(cuò),錯(cuò)誤是
該網(wǎng)頁(yè)無(wú)法正常運(yùn)作
localhost?意外終止了連接。
ERR_INCOMPLETE_CHUNKED_ENCODING
原文地址 http://www.cnblogs.com/zitjubiz/p/net_core_daily_1.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是默认站点為你收集整理的把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2018年4月更新70多个公司dnc招聘
- 下一篇: windows rt_如何在Window