ASP.NET Core

核心功能

ASP.NET Core 核心設計上是採用 Open Web Interface for .NET (OWIN)  為概念發展，OWIN 在概念上就強調以程式碼來定義系統功能，並一度在 ASP.NET MVC 5 列入其功能之一，後續的 Web API 與 SignalR 也使用了 OWIN，但並沒有引起太多開發人員的重視，其主因還是因為 Visual Studio 簡化了太多元件間參考定義的工作，若是要回歸由原始碼作業，反而會讓開發人員無法適應。但隨著微軟確定將 ASP.NET Core 開發為可跨平台的核心架構時，其專案參考系統也由 Visual Studio 為主的加入參考對話盒轉向到以 project.json (.NET Core / ASP.NET Core 的專案組態檔) 為主，使得開發人員不能再以 GUI 介面來加入元件參考，只能利用編輯 project.json 的方式加入，這時由程式碼加入功能的作法才慢慢的被開發人員所接受，雖然這在 Mac 以及 Linux 環境是再平常不過的事。

由程式碼決定功能

ASP.NET Core 廣泛應用了 .NET 的擴充方法 (Extension Method)，將 ASP.NET Core 的功能模組 (ASP.NET Core 的術語是 Middleware) 以擴充方法的方式附掛在 IApplicationBuilder 介面上，以 Use 開頭的方法為命名標準，所有應用程式所需要的功能都必須添加在 Startup 類別內，DNX Runtime 在啟動時會搜尋應用程式內的 Startup 物件，並喚起它內部的特定方法 (如 Configure())，以加入應用程式的功能。
例如下列程式碼：
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());

    app.UseStaticFiles();

    app.UseIdentity();

    // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715

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

代管 (Hosting) 方式

ASP.NET Core 支援自我代管 (Self-hosting) 以及 Web Server 代管 (Web Server-hosting) 的功能 ，早期 ASP.NET Core 有延續以 IIS 為主要代管服務的設計 (當時的代號為 Helios)，但是到了 ASP.NET Core Beta 8 時，微軟宣布將以 Kestrel Server 為主要的代管伺服器 ，Kestrel Server 是以 libuv 為基礎開發的 Web Server 代管行程 (Hosting Process)，藉由 libuv 的協助，Kestrel Server 可跨平台，也可適用於 IIS，微軟也為了 IIS 使用 Kestrel Server 而發展了 IIS Platform Handler，讓 IIS 可直接將 HTTP 的要求直接轉送給 Kestrel Server。
自 ASP.NET Core 1.0.0-rc1 起，代管方式已經回歸以 Kestrel Server 為主，原本的 IIS Platform Handler 也依 ASP.NET Core 的特性改寫為 ASP.NET Core Module，若要使用 IIS 架設 ASP.NET Core 應用程式，必須要使用此模組。

專案系統

在 ASP.NET Core v1.0 時期，ASP.NET Core 不再使用 .csproj 的專案管理方式，而是改用以目錄為主的專案管理，原本的 Web.config 也不再存在，取而代之的是 project.json，以及作為組態設定的 appsettings.json 檔案，這兩個檔案都是JSON格式。雖然在 Visual Studio 的 ASP.NET Core 的專案範本中，Web.config 仍然存在，但它的存在只是為了要在 IIS 中附掛上 HTTP Platform Handler 而已。
隨著 .NET Core v1.1 回歸到 MSBuild 的策略，ASP.NET Core v1.1 起再次回到 .csproj 的專案管理方式，但仍保留以目錄為主的專案管理作法。

project.json

ASP.NET Core v1.0 時期由 project.json 主掌專案的執行期的組態設定，包含專案的套件參考 (Package References)、專案的基本設定、啟動指令、包含或排除指定目錄、以及建造時的相關事件指令等。
下列JSON為 project.json 的範例：
{
  "userSecretsId": "...",

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0-rc2-3002538",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0-rc2-20828",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-20828",
    "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0-rc2-20828",
    "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0-rc2-20828",
    "Microsoft.AspNetCore.Mvc": "1.0.0-rc2-20828",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview1-20828",
      "type": "build"
    },
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-20828",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-20828",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0-rc2-20828",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-20828",
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview1-20828",
      "type": "build"
    },
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-20828",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-20828",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc2-20828",
    "Microsoft.Extensions.Logging": "1.0.0-rc2-20828",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-20828",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-20828",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc2-20828",
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview1-20828",
      "type": "build"
    },
    "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
      "version": "1.0.0-preview1-20828",
      "type": "build"
    }
  },

  "tools": {
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview1-20828",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview1-20828",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview1-20828",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    },
    "Microsoft.Extensions.SecretManager.Tools": {
      "version": "1.0.0-preview1-20828",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview1-20828",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "gcServer": true
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }}

appsettings.json

appsettings.json 是用來替代 Web.config 內的 <appSettings /> 與 <connectionStrings /> 兩個開發人員最常用的組態區段，其內容範例如下:
{
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnet5-WebApplication1-8479b9ce-7b8f-4402-9616-0843bc642f09;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"
    }
  }}
不過 appsettings.json 不像 project.json 是由 DNX 自動讀取，appsettings.json 或是後續加入的組態檔都是屬於功能之一，依照 ASP.NET Core 由程式碼決定功能的特性，開發人員需要加入下列程式才能讓 appsettings.json 生效。
public Startup(IHostingEnvironment env){
    // Set up configuration providers.
    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    Configuration = builder.Build();}

v1.1 時期

隨著 .NET Core 1.1 回歸 MSBuild 建置系統管理後，ASP.NET Core 1.1 的套件管理也可支援 IDE GUI 的圖形化介面參考管理功能。
ASP.NET Core 1.1 的 Visual Studio 工具也另外加入了 Bower 套件的圖形化介面管理功能。

套件相依管理

ASP.NET Core 的套件相依管理 (Package Dependency Management) 由 project.json 負責，project.json 內的 dependencies 區段以及 frameworks 區段負責管理對套件的相依，以及對特定 Framework 版本內組件的相依。
dependencies 內的套件是以 "套件程式碼": "版本" 的格式設定，例如 "Microsoft.AspNet.Mvc": "1.0.0-rc1-final" 表示參考 Microsoft.AspNet.Mvc 套件的 v1.0.0-rc1-final 版本。套件與版本資訊是用NuGet所提供，和以往要以加入參考的方式加入對特定組件的相依性有很大的不同，而這也是 .NET Core/ASP.NET Core 的特色之一，不必再安裝大包的 .NET Framework，只要使用 DNU 的 restore 指令，就能還原所參照的相依套件。
  "dependencies": {
    "Microsoft.Bcl.Immutable": "1.1.18-beta-*",
    "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*",
    "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*",
    "Microsoft.AspNet.Logging": "0.1-alpha-*",
    "System.Data.Common": "0.1-alpha-*"
  }
frameworks 則是定義了特定系統環境內所相依的特定組件與其版本，在此定義的組件必須事先就安裝在電腦內才能取用，與 dependencies 會還原套件不同。開發人員可以給定一個字串來代表特定環境 (例如dnx45表示 DNX on .NET 4.5、dnxcore5 表示 DNX on .NET Core 5)，然後在裡面指定特定的組件與其版本。
  "frameworks": {
    "net451": { },
    "dotnet5.4": {
      "dependencies": {
        "Microsoft.CSharp": "4.0.1-beta-23516",
        "System.Collections": "4.0.11-beta-23516",
        "System.Linq": "4.0.1-beta-23516",
        "System.Runtime": "4.0.21-beta-23516",
        "System.Threading": "4.0.11-beta-23516"
      }
    }
  }
自 1.0.0-rc2 起，DNX 的功能由 .NET Core CLI 取代，因此還原套件的指令改為 dotnet restore。