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。