1. 前言 做爲一個.NET Web開發者,我最傷心的時候就是項目開發部署時面對Windows Server上貧瘠的解決方案,一樣是神器Nginx,Win上的Nginx便始終不如Linux上的,你或許會說「幹嗎不用windows自帶的NLB呢」,那這就是我這個小鳥的從衆心理了,君不見Stack Overflow 2016最新架構中,用的負載和緩存技術也都是採用在Linux上已經成熟的解決方案嗎。沒辦法的時候找個適合的解決辦法是好事,有辦法的時候固然要選擇最好的解決辦法。json 所幸,.ASP.NET Core出現了,它順應了開源大趨勢,擺脫了一直爲人詬病的Win Server,以ASP.NET的跨平臺版本出如今了咱們的眼前。暫且不論Benchmark中無聊的性能比較,也不探討未來是否能和JAVA,PHP Web應用平起平坐,可是至少對咱們.NET平臺開發者來講,咱們多了一種開發方向,也多了一個嘗試前沿成熟技術的機會。所謂工欲善其事,必先利其器,咱們先來看看ASP.NET Core是什麼吧。windows 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上app 中間件支持框架 性能優化 無所不在的依賴注入 標準日誌記錄 整合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,大意是它能夠自動壓縮關聯文件用於項目中,如生成 |