NET Core 介紹
標簽: ASP.NETCore
1. 前言
作為一個.NET Web開發者,我最傷心的時候就是項目開發部署時面對Windows Server上貧瘠的解決方案,同樣是神器Nginx,Win上的Nginx便始終不如Linux上的,你或許會說“干嘛不用windows自帶的NLB呢”,那這就是我這個小鳥的從眾心理了,君不見Stack Overflow 2016最新架構中,用的負載和緩存技術也都是采用在Linux上已經成熟的解決方案嗎。沒辦法的時候找個適合的解決辦法是好事,有辦法的時候當然要選擇最好的解決辦法。
所幸,.ASP.NET Core出現了,它順應了開源大趨勢,擺脫了一直為人詬病的Win Server,以ASP.NET的跨平台版本出現在了我們的眼前。暫且不論Benchmark中無聊的性能比較,也不探討將來是否能和JAVA,PHP Web應用分庭抗禮,但是至少對我們.NET平台開發者來說,我們多了一種開發方向,也多了一個嘗試前沿成熟技術的機會。所謂工欲善其事,必先利其器,我們先來看看ASP.NET Core是什么吧。
2. ASP.NET Core 簡介
2.1 什么是ASP.NET Core
ASP.NET Core 是一個新的開源和跨平台的框架,用於構建如 Web 應用、物聯網(IoT)應用和移動后端應用等連接到互聯網的基於雲的現代應用程序。ASP.NET Core 應用可運行於 .NET Core 和完整的 .NET Framework 之上。它整合了原來ASP.NET中的MVC和WebApi框架,你可以在 Windows、Mac 和 Linux 上跨平台的開發和運行你的 ASP.NET Core 應用。
2.2 ASP.NET Core的特點
ASP.NET Core 在架構上做出了一些改變,這些改變會使它成為一個更為精簡並且模塊化的框架。在project.json文件中我們可以發現,ASP.NET Core 不再基於 System.Web.dll(我們在project.json中見到的大部分都是Microsoft打頭) ,基於一系列顆粒化的,並且良好構建的 NuGet 包,結合智能提示,它能夠讓你通過僅僅包含需要的 NuGet 包的方法來優化你的應用。一個更小的應用程序接口通過“只為你需要的功能付出”(pay-for-what-you-use)的模型獲得的好處包括更可靠的安全性、簡化服務、改進性能和減少成本。
Tips:通過 Ctrl+F5(非調試模式)啟動這個應用程序允許你進行代碼更改,保存文件,刷新瀏覽器,之后查看代碼改變。許多開發者更傾向於使用非調試模式來快速啟動應用程序和查看變化。
- 開源和跨平台
- 滿足運行在.NET Core和.NET Framework上
- 中間件支持
- 性能優化
- 無所不在的依賴注入
- 標准日志記錄
- 整合MVC和Web Api到一個框架中
- MVC 標簽幫助
- CLI工具
2.3 ASP.NET Core 項目文件夾解讀
ASP.NET Core 1.0 發布以來,相較於傳統項目編碼發布的行為,新項目中的操作已經有了很大的變化,如解析依賴,選擇運行平台和Runtime等等,就連項目結構也有了比較大的改變,越來越多的配置選項由編輯器轉交給了開發者手動決定,這一點在新的各類配置文件中體現得尤為明顯,這里就來簡單解讀一下。
Tips:順便吐槽一下都Upadte3了,最新的.NET Core項目中,Visual操作中還是有好多明顯的bug呀。
2.3.1 項目文件夾總覽

2.3.2 project.json和global.json
project.json是.NET Core項目中最重要的一個配置文件,它類似於.NET Framework上的 .csrpoj文件(在下一版本中.NET Core將棄用該文件,轉而回歸.csrpoj)。所以這里還是搬運下張大大的博客吧,包括對global.json的解讀。
project.json 這葫蘆里賣的什么葯
2.3.1 Properties——launchSettings.json
顧名思義——啟動配置文件。launchSettings.json文件為一個ASP.NET Core應用保存特有的配置標准,用於應用的啟動准備工作,包括環境變量,開發端口等。在launchSettings.json文件中進行配置修改,和開發者右鍵項目——屬性中所提交的更改的效果是一樣的(目前右鍵屬性中的Property真是少得可憐),並且支持同步更新。
{
"iisSettings": { #選擇以IIS Express啟動 "windowsAuthentication": false, #是否啟用windows身份驗證 "anonymousAuthentication": true, #是否啟用匿名身份驗證 "iisExpress": { "applicationUrl": "http://localhost:24269/", #IIS Express隨機端口 "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "WebApplication": { #選擇本地自宿主啟動,詳見Program.cs文件。刪除該節點也將導致Visual Studio啟動選項缺失 "commandName": "Project", # "launchBrowser": true, "launchUrl": "http://localhost:5000", #本地自宿主端口 "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
2.3.4 Startup.cs
Startup.cs文件是ASP.NET Core的啟動入口文件,想必嘗試過OWIN開發的一定不會陌生。項目運行時,編譯器會在程序集中自動查找Startup.cs文件讀取啟動配置。除了構造函數外,它可以定義Configure和ConfigureServices方法。
(1) 構造函數
用來啟動配置文件Configuration
public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); if (env.IsDevelopment()) //讀取環境變量是否為Development,在launchSettings.json中定義 { // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately. builder.AddApplicationInsightsSettings(developerMode: true); } Configuration = builder.Build(); }
(2) ConfigureServices
ConfigureServices 用來配置我們應用程序中的各種服務,它通過參數獲取一個IServiceCollection 實例並可選地返回 IServiceProvider。ConfigureServices 方法需要在 Configure 之前被調用。我們的Entity Framework服務,或是開發者自定義的依賴注入(ASP.NET Core自帶的依賴注入也是無所不在),更多內容請見官方文檔
public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); services.AddMvc(); }
(3) Configure
Configure 方法用於處理我們程序中的各種中間件,這些中間件決定了我們的應用程序將如何響應每一個 HTTP 請求。它必須接收一個IApplicationBuilder參數,我們可以手動補充IApplicationBuilder的Use擴展方法,將中間件加到Configure中,用於滿足我們的需求。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); app.UseApplicationInsightsRequestTelemetry(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseApplicationInsightsExceptionTelemetry(); app.UseStaticFiles(); app.UseMvc(routes => //MVC路由配置 { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
2.3.5 bundleconfig.json
bundleconfig.json是一個壓縮包的集合文件(這個不是很明白),這里有一篇bundleconfig.json specs,大意是它可以自動壓縮關聯文件用於項目中,如生成 <script> 和 <link>符號.
2.3.6 wwwroot和bower.json
wwwroot是一個存放靜態內容的文件夾,存放了諸如css,js,img等文件。剛才提到新的ASP.NET Core使開發靈活度大大提高,文件配置也都是手動為主,所以既然有存放文件的wwwroot,那也有存放文件引用的bower.json:
{
"name": "asp.net", "private": true, "dependencies": { "bootstrap": "3.3.6", "jquery": "2.2.0", "jquery-validation": "1.14.0", "jquery-validation-unobtrusive": "3.2.6" } }
bower.json記錄了項目需要的相關文件引用,我們可以在里面自由刪除增加需要的文件,如jquery.form.js,Bower配置管理器也會自動幫我們在github上下載相關文件,下載后的文件也將放在wwwroot文件夾中。這些改變在項目的“依賴項”上都能直觀查看。
Tips:每個項目中只能有一個bower.json配置文件,對於
bower.json的詳細信息請參見Bower —— 管理你的客戶端依賴關系
2.3.7 appsettings
同樣是顧名思義——應用配置,類似於.NET Framework上的Web.Config文件,開發者可以將系統參數通過鍵值對的方式寫在appsettings文件中(如程序的連接字符串),而Startup類中也在構造器中通過如下代碼使得程序能夠識別該文件
var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables();
