Amazing ASP.NET Core 2.0

来源:http://www.cnblogs.com/savorboard/archive/2017/05/25/aspnetcore2-feature.html
-Advertisement-
Play Games

前言 ASP.NET Core 的變化和發展速度是飛快的,當你發現你還沒有掌握 ASP.NET Core 1.0 的時候, 2.0 已經快要發佈了,目前 2.0 處於 Preview 1 版本,意味著功能已經基本確定,還沒有學習過 ASP.NET Core 的同學可以直接從 2.0 開始學起,但是如 ...


前言

ASP.NET Core 的變化和發展速度是飛快的,當你發現你還沒有掌握 ASP.NET Core 1.0 的時候, 2.0 已經快要發佈了,目前 2.0 處於 Preview 1 版本,意味著功能已經基本確定,還沒有學習過 ASP.NET Core 的同學可以直接從 2.0 開始學起,但是如果你已經掌握了 1.0 的話,那麼你只需要瞭解在 2.0 中增加和修改的一些功能即可。

每一次大版本的發佈和升級,總會帶給開發人員一些驚喜和令人興奮的特性,有關 ASP.NET Core 本次的 2.0 版本的新特性,主要集中在幾個部分上。

SDK 的變化

PS: 目前如果你想在VS中體驗 ASP.NET Core 2.0 全部特性的話,你需要 VS 2017.3 預覽版本。當然你可以使用 VS Core 來快速瞭解。

.NET Core 2.0 Priview 的下載地址:
https://www.microsoft.com/net/core/preview#windowscmd

完成之後可以在 cmd 中使用以下命令查看版本。

變化1:添加瞭如下圖箭頭所指新命令。

dotnet new razor
dotnet new nugetconfig
dotnet new page
dotnet new viewimports
dotnet new viewstart

添加了這些新的cli命令。 其中 viewimports,viewstart 即為Razor視圖中的_xxx.cshtml那兩個文件.

變化2dotnet new xxx 將會自動還原 NuGet 包,不需要你再次進行 dotnet restore 命令了。

G:\Sample\ASPNETCore2 > dotnet new mvc

The template "ASP.NET Core Web App (Model-View-Controller)" was created successfully.
This template contains technologies from parties other than Microsoft, see https://aka.ms/template-3pn for details.

Processing post-creation actions...
Running 'dotnet restore' on G:\Sample\ASPNETCore2\ASPNETCore2.csproj...
Restore succeeded.

*.csproj 項目文件

在 2.0 中,當創建一個 MVC 項目的時候,生成的 csporj 項目文件如下:

其中,紅色箭頭部分為新增內容,我們依次來看一下:

MvcRazorCompileOnPublish

在 1.0 版本中,如果我們需要在發佈的時候編譯 MVC 中的 Views 文件夾為DLL的話,需要引用
Microsoft.AspNetCore.Mvc.Razor.ViewCompilation 這個 NuGet 包,而現在已經不需要了,這個功能已經預設的集成在了SDK中,只需要在csporj添加配置即可,在發佈的時候將會自動打包 Views 文件夾中的 *.cshtml 文件為 DLL 程式集。

PackageTargetFallback

這個配置項是用來配置當前程式集支持的目標框架。

UserSecretsId

這個是用來存儲程式中使用的機密,以前是存儲在 project.json 文件中,現在你可以在這裡進行配置了。

有關 UserSecrets 的更多信息,可以查看我的這篇博客文章

MVC 相關包

<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0-preview1-final" />

在 Core MVC 2.0 中,所有MVC相關的NuGet 包都被集成到了這個Microsoft.AspNetCore.All包中,它是一個元數據包,包含了大量的東西,其中包括:Authorization, Authentication, Identity, CORS, Localization, Logging, Razor, Kestrel 等,除了這些它還附加了 EntityFramework, SqlServer, Sqlite 等包。

有些同學可能會覺得這樣會引用了很多項目中使用不到的程式集,導致發佈後的程式變得很龐大,不過我要告訴你不必擔心,發佈後的程式集不但不會變得很大,反而會小很多,因為 Microsoft 把所有的這些依賴全部都集成到了sdk中,也就是說當你安裝sdk的之後,MVC相關的包就已經安裝到了你的系統上。

這樣的好處是你不用擔心更新Nuget包或者刪除的時候,因為大量的版本不一致問題導致隱藏的衝突問題,另外一個好處就是,這樣對於很多新手的話就很友好 2333,他們不需要知道他們什麼情況下會從那個NuGet 包中獲取自己需要的信息。

現在,發佈後的文件夾是如此簡潔: 大小 4.3M

再貼個以前的 發佈後的文件夾你們感受一下: 大小 16.5M

有些同學可能好奇他們把那些引用的 MVC 包放到哪裡了,預設情況下他們位於這個目錄:

C:\Program Files\dotnet\store\x64\netcoreapp2.0

新的 Program.cs 和 Startup.cs

現在,當創建一個 ASP.NET Core 2.0 MVC 程式的時候,Program 和 Startup 已經發生了變化,他們已經變成了這樣:

Program.cs

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.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    
    public IConfiguration Configuration { get; }
    
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

可以發現,新的 Program.cs 中和 Startup.cs 中的內容已經變得很簡單了,少了很多比如 appsetting.json 文件的添加,日誌中間件, Kertrel , HostingEnvironment 等,那麼是怎麼回事呢? 其他他們已經被集成到了 WebHost.CreateDefaultBuilder 這個函數中,那麼我們跟進源碼來看一下內部是怎麼做的。

WebHost.CreateDefaultBuilder

下麵是 WebHost.CreateDefaultBuilder 這個函數的源碼:

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
    var builder = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

            if (env.IsDevelopment())
            {
                var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                if (appAssembly != null)
                {
                    config.AddUserSecrets(appAssembly, optional: true);
                }
            }

            config.AddEnvironmentVariables();

            if (args != null)
            {
                config.AddCommandLine(args);
            }
        })
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.UseConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
        })
        .UseIISIntegration()
        .UseDefaultServiceProvider((context, options) =>
        {
            options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
        })
        .ConfigureServices(services =>
        {
            services.AddTransient<IConfigureOptions<KestrelServerOptions>, KestrelServerOptionsSetup>();
        });

    return builder;
}

可看到,新的方式已經隱藏了很多細節,幫助我們完成了大部分的配置工作。但是你知道怎麼樣來自定義這些中間件或者配置也是必要的技能之一。

appsettings.json 的變化

在 appsettings.json 中,我們可以定義 Kestrel 相關的配置,應用程式會在啟動的時候使用該配置進行Kerstrel的啟動。

{
    "Kestrel": {
        "Endpoints": {
            "Localhost": {
                "Address": "127.0.0.1",
                "Port": "9000"
            },
            "LocalhostHttps": {
                "Address": "127.0.0.1",
                "Port": "9001",
                "Certificate": "Https"
            }
        }
    },
    "Certificate": {
        "HTTPS": {
            "Source": "Store",
            "StoreLocation": "LocalMachine",
            "StoreName": "MyName",
            "Subject": "CN=localhost",
            "AllowInvalid": true
        }
    },
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Warning"
        }
    }
}

以上配置內容配置了 Kertrel 啟動的時候使用的本地地址和埠,以及在生產環境需要使用的 HTTPS 的配置項,通常情況下關於 HTTPS 的節點配置部分應該位於 appsettings.Production.json 文件中。

現在,dotnet run在啟動的時候將同時監聽 9000, 和 9001 埠。

日誌的變化

在 ASP.NET Core 2.0 中關於日誌的變化是非常令人欣慰的,因為它現在不是作為MVC中間件配置的一部分了,而是 Host 的一部分,這句話好像有點彆扭,囧~。 這意味著你可以記錄到更加底層產生的一些錯誤信息了。

現在你可以這樣來擴展日誌配置。

  public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureLogging(factory=>{你的配置})
        .Build();

全新的 Razor Pages

ASP.NET Core 2.0 引入的另外一個令人興奮的特性就是 Razor Pages。提供了另外一種方式可以讓你在做Web 頁面開發的時候更加的沉浸式編程,或者叫 page-focused 。額...它有點像以前 Web Form Page,它隸屬於 MVC 框架的一部分,但是他們沒有 Controller。

你可以通過 dotnet new razor 命令來新建一個 Razor Pages 類型的應用程式

Razor Pages 的 cshtml 頁面代碼可能看起來是這樣的:

@page

@{
    var message = "Hello, World!";
}

<html>
<body>
    <p>@message</p>
</body>
</html>

Razor Pages 的頁面必須具有 @page 標記。他們可能還會有一個 *.cshtml.cs 的 class 文件,對應的頁面相關的一些代碼,是不是很像 Web Form 呢?

有同學可能會問了,沒有 Controller 是怎麼路由的呢? 實際上,他們是通過文件夾物理路徑的方式進行導航,比如:

文件名和路徑 匹配的URL
/Pages/Index.cshtml / or /Index
/Pages/Contact.cshtml /Contact
/Pages/Store/Contact.cshtml /Store/Contact

有關 Razor Pages的更多信息可以看這裡:
https://docs.microsoft.com/en-us/aspnet/core/razor-pages

總結

可以看到,在 ASP.NET Core 2.0 中,給我們的開發過程帶來了很多便利和幫助,他們包括 Program 等的改進,包括 MVC 相關 NuGet 包的集成,包括appsetting.json的伺服器配置,以及令人驚訝的Razor Page,是不是已經迫不及待的期待正式版的發佈呢?如果你期待的話,點個【推薦】讓我知道吧~ 2333..

如果你對 ASP.NET Core 有興趣的話可以關註我,我會定期的在博客分享我的學習心得。


本文地址:http://www.cnblogs.com/savorboard/p/aspnetcore2-feature.html
作者博客:Savorboard
歡迎轉載,請在明顯位置給出出處及鏈接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Mysql中可用存儲過程和函數來實現複雜邏輯處理,兩者的對比如下:存儲過程作為可執行文件,編譯一次放在資料庫中,函數又返回值。可設定使用許可權。 存儲過程中可使用游標,聲明變數。用call調用。 2.Hive可用udf(user defined function)來實現複雜邏輯處理 編輯Pytho... ...
  • 1. 安裝前的準備 1.1 硬體要求 無特殊需求(根據Hadoop各個組件需求及實際情況,一般建議單個集群的機器數量在3台及以上:1台Master結點,2台機器作為Slave結點)。 1.2 軟體要求 1.2.1 操作系統 僅支持如下操作系統: Red Hat Enterprise Linux (R ...
  • ———————————————————————————————————————————— PWM(脈衝寬度調製) 對模擬信號電平進行數字編碼的方法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
  • Ubuntu目錄 / /bin /sbin /boot /etc /mnt /home d :directory - :file b :block 磁碟以塊進行 l :link Ubuntu許可權 User Group Other r :read w :write x :execute - :none ...
  • xx-net在ubuntu上運行用起來很方便,如果有一些原因必須用CentOS,麻煩就比較大了。 首先需要升級python版本,CentOS自帶的2.6版本是用不了的,必須升級到2.7以上,但是不能用python3,yum可能升不到2.7,所以只能去官網下載源碼編譯安裝。yum本身依賴python, ...
  • 概述 iptables是linux自帶的防火牆軟體,用於配置IPv4數據包過濾或NAT(IPv6用ip6tables)。 在linux上,防火牆其實是系統內核的一部分,基於Netfilter構架,基本原理就是在內核網路層數據包流經的不同位置放置一些鉤子(hook),利用這些嵌入網路層的hook來對數 ...
  • 工作原理見書《51單片機應用及原理——基於KeilC和Proteus,陳海宴》P178-180 ...
  • 《鳥哥的Linux私房菜 (基礎學習篇 第三版)》是頗具知名度的Linux入門書《鳥哥的Linux私房菜:基礎學習篇》的全新版,全面而詳細地介紹了Linux操作系統。 全書分為5個部分:第一部分著重說明Linux的起源及功能,如何規劃和安裝Linux主機;第二部分介紹Linux的文件系統、文件、目錄 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...