本文章是由機器翻譯。

ASP.NET 5

探究 ASP.NET 5 執行階段

Daniel Roth

去年 11 月,微軟宣佈ASP.NET5 作為一個新的開放源碼和跨平臺的框架,用於構建現代的 Web 和雲的應用程式使用 Microsoft.NET 框架。我們 (ASP.NET開發團隊,其中我是一部分) 發佈了ASP.NET5 預覽和Visual Studio2015年預覽在 connect () ; 在紐約城的事件。我向你介紹 5ASP.NET運行庫和其新的Visual Studio專案系統在"引入ASP.NET5 預覽"文章從特殊 Dec。 15、 2014 年,MSDN 雜誌問題 (bit.ly/1K4PY4U)。自從去年 12 月,最後看看ASP.NET5 已經進行了兩個更多預覽版本的ASP.NET5:Beta2 與Visual Studio2015 CTP 5,並與Visual Studio2015 CTP 6 Beta3。 每個發行版本中,框架繼續發展和改進。在許多情況下,這些改進了慷慨捐贈的.NET 社區通過 GitHub 的公共ASP.NET專案 (bit.ly/1DaY7Cd)。在這篇文章,我要從深層次看新ASP.NET5 運行時見到的最新版本中的更改內容,引擎蓋下。

K 運行時環境 (KRE)

正如你看到早在 12 月,ASP.NET5 基於靈活、 跨平臺運行庫宿主可以承載幾個.NET Clr 之一。你可以在其完整的 API 集最大的相容性與.NET 框架運行 5ASP.NET應用程式。您還可以對新的.NET 核心,使真正的肩並肩部署,你可以將複製到現有的環境,而無需更改任何其他電腦上運行ASP.NET5。在將來,您也能夠在.NET 核心上運行ASP.NET5 跨平臺和運行的社會支援對今天的單跨平臺。

運行時宿主基礎結構用於ASP.NET5 目前稱為 K 運行時環境 (KRE),這是一個泛型預留位置名稱,直到我們確定的正式名稱。KRE 提供了一個.NET 應用程式運行所需要的一切的環境:宿主進程,CLR 託管的邏輯,託管進入點發現,等等。KRE 建成運行跨平臺.NET Web 應用程式,但是它可以運行其他類型的.NET 應用程式,例如主控台應用程式。KRE 基於相同的.NET CLR 和基底類別庫.NET 開發人員來瞭解和喜愛,同時支援在 Windows、 OS X 與 Linux 上運行.NET 應用程式的跨平臺支援。

從邏輯上講,KRE 有五層的功能。我將描述每個這些層和他們的責任。

第 1 層。 本機進程: 本機進程是一個非常薄層負起責任,查找和調用本機 CLR 主機,傳遞給進程使用的堆疊其餘部分的參數。在 Windows 上,這是一個本機可執行檔 (klr.exe) ; Mac 或 Linux 上它是一個可執行檔 bash 腳本。使用任一新的本機 HTTP 模組或者通過使用太陽神之庇佑裝載機,完成在 IIS 上運行。太陽神之庇佑裝載機利用.NET Framework 4.5.1 引導 KRE 而不需要安裝新的 IIS 模組中的擴充性掛鉤。與本機 HTTP 模組您可以運行基於.NET 核心的 Web 應用程式在 IIS 上而不依賴任何.NET 框架。雖然本機 HTTP 模組不是尚未公開的我們打算使它在未來的預覽中可用。

圖層 2 和 3。 本機 CLR 宿主和 CLR:本機 CLR 主機具有三個主要職責:

  1. 啟動 CLR。這如何實現取決於版本的 CLR。例如,啟動.NET 核心涉及載入 coreclr.dll,配置和啟動運行時,並創建 AppDomain 所有託管代碼將運行。 對於單聲道和.NET Framework 4.5.1,過程有所不同,但結果是一樣的。
  2. 調用的託管的進入點,是下一層。
  3. 當本地主機的進入點返回時,此過程將然後起來並且關閉下來 CLR — — 那就是,卸載應用程式域和停止運行時。

第 4 層:託管的進入點:這一層是用託管代碼編寫的第一層。它還負責:

  1. 載入程式集和滿足依賴項從 lib 資料夾。
  2. 設置 IApplicationEnvironment 和核心的依賴注入基礎設施。
  3. 調用指定的應用程式或應用程式宿主的主進入點。

在這一層,程式集被載入只能從應用程式基路徑或指定的 lib 資料夾。它是添加額外載入程式解析從 NuGet 套裝程式或甚至在運行時編譯的代碼的依賴關係的下一層。

Layer 5:應用程式主機/應用程式:如果開發人員編譯整個應用程式向磁片上 lib 資料夾中的程式集時,這一層是應用程式 — — 應用程式最終使用者看到。如果你想要做到這一點,你可以編譯您的應用程式並傳遞時發射第 1 層包含一個標準的主進入點的 DLL 的名稱。

然而,在大多數情況下,您將使用應用程式主機來説明解決應用程式依賴項並運行您的應用程式。Microsoft.Framework.ApplicationHost 是在 KRE 中提供的應用程式宿主,其職責包括:

  1. 行走中 project.json 和建立依賴關係的閉包的依賴關係將使用該應用程式。依賴項-­遍歷邏輯更為詳細地介紹了 bit.ly/1y5lZEm
  2. 添加附加程式集載入程式可以載入程式集從各種來源,如安裝 NuGet 套裝程式,在運行時使用羅斯林等編譯的源。
  3. 調用程式集的進入點的名字是作為參數給出本機進程啟動時。程式集可以是任何與 ApplicationHost 知道如何載入的進入點。帶有 KRE ApplicationHost 知道如何找到主要的公共 void 方法。這是用於設置ASP.NET託管層,知道如何找到 Startup.cs 並運行您的 Web 應用程式的配置方法的進入點。

這一點要注意,你在學習關於 KRE 是低級堆疊的一部分。當 KRE 一級運作,世界仍然是很多關於查找和載入動態連結程式庫 (Dll)。它是 KRE,其中包含邏輯,可以在應用程式級別,以只想到包和其他頂級的依賴性。

跨平臺 SDK 工具

KRE 是與 SDK 包含一切您需要構建跨平臺.NET 應用程式打包在一起。在對ASP.NET5 我上一篇文章中,我描述了如何使用 KRE 版本管理器 (KVM) 工具列出已安裝的 KREs 您的電腦上,安裝新的應用並選擇您想要使用的 KRE。你可以找到有關如何為您的作業系統安裝 KVM 說明 bit.ly/1y5mqyi

KVM 安裝 KREs 從飼料 NuGet 配置使用 KRE_FEED 環境變數。KREs 情況並非傳統意義上的 NuGet 套裝程式,他們並不是的包你會永遠依賴的 ; NuGet 是只是一個方便的方式來分發和版本 KREs。預設情況下,KRE 安裝複製並提取 KRE.ZIP 檔案到 %USERPROFILE%\.k\runtimes。

我以前也曾介紹了安裝、 恢復和創建 NuGet 套裝程式的 K封裝管理員(KPM) 工具。我們計畫將 KPM 工具重命名為 nuget,並與現有的 NuGet 用戶端對齊。作為此對齊方式的一部分,一些 kpm 子命令已重命名。你現在使用捆綁命令捆綁申請出版和 pack 命令建立和創建 NuGet 套裝程式的一個專案。更新後的生成命令沒有任何包裝生產原料生成輸出。也是一個新的換行命令,允許工具,以引用現有的基於 csproj 的專案,在 project.json 中。 預設情況下,套裝軟體現在安裝在 %USERPROFILE%\.k\packages 資料夾中,但您可以通過在您的 global.json 檔中設置包路徑加以控制。

一個跨平臺.NET 主控台應用程式

我現在將顯示你如何創建簡單跨平臺.NET 主控台應用程式使用 KRE。首先,我需要創建一個 DLL 的進入點,我可以做使用Visual Studio2015年中的 5ASP.NET主控台應用程式專案範本。 代碼應如下所示:

public class Program
{
  public void Main(string[] args)
  {
    Console.WriteLine("Hello World");
    Console.ReadLine();
  }
}

這看起來很熟悉,但注意到的進入點是實際上的實例方法。除了靜態的 Program.Main 進入點,KRE 還支援基於實例的進入點。你甚至可以主進入點非同步和返回的任務。有的主進入點實例方法,你可以有服務注入到您的應用程式的運行時環境。

您可以通過從包含應用程式的 project.json 檔的目錄運行"k 運行"來運行此應用程式從內Visual Studio,或在命令列上。K 命令是真的只是一個簡單的批次檔和"k 運行"命令可以擴展到以下內容:

klr.exe --appbase . Microsoft.Framework.ApplicationHost run

K 命令執行本機進程 (klr.exe)、 指定的應用程式基為目前的目錄,然後指定預設應用程式主機。本機進程已預設應用程式主機沒有專門知識 — — 它只是尋找一個標準的切入點在 Microsoft.Framework.ApplicationHost 大會並調用到它。

如果您不想使用預設的應用程式宿主可以調用本機的層進您的應用程式直接調用。要做到這一點,首先要構建此專案以生成主控台應用程式的 DLL。請確保您選中該專案的生成屬性中的"生產產出上生成"選項。您可以在您的解決方案資料夾找到文物目錄下的生成輸出。導航到包含您正在使用 KRE 風味,但調用"klr.exe < DLL 名稱 >"以查看從主控台應用程式輸出的內置 DLL 的目錄。

直接調用 DLL 是一個非常低級和原始的方式,來編寫應用程式。所以你放棄 project.json 支援和改進的 NuGet 基於依賴項管理支援,不使用預設的應用程式宿主。相反,任何你所依賴的庫都簡單地載入指定的 lib 資料夾中。對於本文的其餘部分,我將使用預設應用程式主機。

你可以使用 IServiceManifest 服務來枚舉所有可用的運行時環境的服務。你不需要指定任何附加的依賴項,以在所有使用此程式集,因為它是大會中立介面 (ANI)。尼斯是完全由他們的名稱標識的類型和命名空間和他們都是 KRE 的一個特點。兩個非特定程式集的類型在不同的程式集,但具有相同的名稱和命名空間被視為等效。這意味著只需本地而無需聲明一個萬用群組件的依賴關係宣佈通用的抽象。

在您這樣的主控台應用程式中,您可以定義您自己的程式集中性 IServiceManifest 介面:

namespace Microsoft.Framework.DependencyInjection.ServiceLookup
{
  [AssemblyNeutral]
  public interface IServiceManifest
  {
    IEnumerable<Type> Services { get; }
  }
}

但 AssemblyNeutralAttribute 是從哪兒來的?嗯,它當然是大會中性 !所以你將它聲明本地,太:

namespace Microsoft.Net.Runtime
{
  [AssemblyNeutral]
  [AttributeUsage(AttributeTargets.All, 
    Inherited = false, AllowMultiple = true)]
  public sealed class AssemblyNeutralAttribute : Attribute
  {
  }
}

獲取在運行時與同類型正在使用 KRE 統一這些非特定程式集的類型。

中的代碼圖 1 IServiceManifest 服務注入應用程式通過向程式類添加建構函式,然後逐一查看服務。

圖 1 IServiceManifest 服務注入應用程式

namespace ConsoleApp1
{
  public class Program
  {
    public Program(IServiceManifest serviceManifest)
    {
      ServiceManifest = serviceManifest;
    }
    IServiceManifest ServiceManifest { get; }
    public void Main(string[] args)
    {
      foreach (Type type in ServiceManifest.Services)
      {
        Console.WriteLine(type.FullName);
      }
    }
  }
}

應用程式宿主將啟用對 project.json 的支援、 添加附加程式集衝突解決程式 (用於處理 NuGet 套裝程式、 專案引用和類似) 和做大量的額外的服務應用程式在應用程式調用的進入點之前可用。主控台應用程式運行時,輸出現在應該像這樣:

Microsoft.Framework.Runtime.IAssemblyLoaderContainer
Microsoft.Framework.Runtime.IAssemblyLoadContextAccessor
Microsoft.Framework.Runtime.IApplicationEnvironment
Microsoft.Framework.Runtime.IFileMonitor
Microsoft.Framework.Runtime.IFileWatcher
Microsoft.Framework.Runtime.ILibraryManager
Microsoft.Framework.Runtime.ICompilerOptionsProvider
Microsoft.Framework.Runtime.IApplicationShutdown

有做檔看,遍歷"圖書館"(專案、 包、 讓編譯選項正在使用的應用程式中的程式集) 的結構和關閉應用程式服務。因為ASP.NET5 和 KRE 仍然在預覽和在積極發展下,你看到的服務的確切清單可能會有所不同。

主辦

ASP.NET託管層運行在 KRE 之上,而負責查找 Web 服務器來運行,尋找應用程式的啟動邏輯、 承載該應用程式在伺服器上的,然後收拾,當應用程式關閉。它還提供了大量的額外主辦相關服務應用程式。

ASP.NET託管 DLL (Microsoft.AspNet.Hosting,在 bit.ly/­1uB6ulW) 具有進入點由 KRE 應用程式主機獲取調用的方法。您可以配置您想要通過指定使用哪個 Web 服務器 — — 伺服器命令列選項或其他來源的配置資料,像 config.json 或環境變數。承載層然後載入指定的伺服器程式集/要查找的類型可用於初始化和啟動伺服器 IServerFactory。通常情況下,伺服器必須列出在你在 project.json 中的依賴關係,以便可以載入它。

請注意在 project.json 中定義的命令是真的只是額外的命令列參數將設置為 klr.exe。 例如,預設的ASP.NET起動器的 Web 應用程式專案範本包含了大量的命令在 project.json,看起來像這樣:

"commands": {
  /* Change the port number when you are self hosting this application */
  "web": "Microsoft.AspNet.Hosting 
    --server Microsoft.AspNet.Server.WebListener
    --server.urls http://localhost:5000",
  "gen": "Microsoft.Framework.CodeGeneration",
  "ef":  "EntityFramework.Commands"
},

所以如果你在運行"k 網站",你真的在運行:

klr.exe --appbase . Microsoft.Framework.ApplicationHost Microsoft.AspNet.Hosting
  --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000

啟動

ASP.NET託管層也是負責尋找您的應用程式的啟動邏輯的。通常情況下,您應用程式的啟動邏輯定義在啟動類中,設置您請求管道的配置方法和一種配置任何的 ConfigureServices 方法服務應用程式的需要,如中所示圖 2

圖 2 啟動類

namespace WebApplication1
{
  public class Startup
  {
    public void ConfigureService(IServiceCollection services)
    {
      // Add services for your application here
    }
    public void Configure(IApplicationBuilder app)
    {
      // Configure your application pipeline here
    }
  }
}

在您的配置方法你使用 IApplicationBuilder 介面生成請求管道為您的應用程式。應用程式產生器允許您"使用"中介軟體、 創造"新的"應用程式產生器和"打造"一個請求委託。請求委託是在ASP.NET5 的核心運行時構造。 請求委託需要 HttpCoNtext 和非同步執行一些有用的事:

public delegate Task RequestDelegate(HttpContext context);

ASP.NET5 中介軟體將作為輸入下一個請求委託在管道中,並請求委託提供中間邏輯。返回的請求委託可能或可能不會調用管道中的下一個請求委託。作為一種快捷的運行並不調用下一個請求委託的中間邏輯,你可以在 IApplicationBuilder 上使用運行擴充方法:

app.Run(async context => await context.Response.WriteAsync("Hello, world!"));

這將是編寫以下嵌入式中介軟體相同的下一個參數被忽略:

app.Use(next => async context =>
  await context.Response.WriteAsync("Hello, world!"));

若要創建可重複使用的中介軟體,你可以寫成,由公約 》,接下來的請求委託注入以及任何額外的服務或中介軟體需要的參數的建構函式的類。您然後實現中介軟體的要求委託為非同步調用方法,如中所示圖 3

圖 3 執行中介軟體作為可重用的類

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
using System.Threading.Tasks;
public class XHttpHeaderOverrideMiddleware
{
  private readonly RequestDelegate _next;
  public XHttpHeaderOverrideMiddleware(RequestDelegate next)
  {
    _next = next;
  }
  public Task Invoke(HttpContext httpContext)
  {
    var headerValue =
      httpContext.Request.Headers["X-HTTP-Method-Override"];
    var queryValue =
      httpContext.Request.Query["X-HTTP-Method-Override"];
    if (!string.IsNullOrEmpty(headerValue))
    {
      httpContext.Request.Method = headerValue;
    }
    else if (!string.IsNullOrEmpty(queryValue))
    {
      httpContext.Request.Method = queryValue;
    }
    return _next.Invoke(httpContext);
  }
}

您可以使用中介軟體以下使用 UseMiddleware < T > 本公約 在 IApplicationBuilder 上的擴充方法。傳遞到此方法的任何其他選項將注入中介軟體建構函式後下一步要求委託和注入的任何服務。按照約定,中介軟體應定義其自己特定的使用擴充方法對 IApplicationBuilder,像這樣:

public static class BuilderExtensions
{
  public static IApplicationBuilder UseXHttpHeaderOverride(
    this IApplicationBuilder builder)
  {
    return builder.UseMiddleware<XHttpHeaderOverrideMiddleware>();
  }
}

然後添加,中介軟體到應用的管道,就像這樣:

public class Startup
{
  public void Configure(IApplicationBuilder app)
  {
    app.UseXHttpHeaderOverride();
  }
}

ASP.NET5 配備了一套豐富的預生成的中介軟體。還有用於處理靜態檔、 路由、 錯誤處理、 診斷程式和安全中介軟體。您可以查找、 下載和安裝來自微軟和社區中介軟體作為 NuGet 套裝程式 nuget.org

佈建服務

與所有其他進入點你看到在此堆疊中,啟動類可以有服務注入從承載層在其建構函式中或作為附加參數的配置和 ConfigureServices 的方法。如果您枚舉可用在啟動時 (使用 IServiceManifest) 的服務,你看到現在甚至更多提供的服務有:

Microsoft.Framework.Runtime.IAssemblyLoaderContainer
Microsoft.Framework.Runtime.IAssemblyLoadContextAccessor
Microsoft.Framework.Runtime.IApplicationEnvironment
Microsoft.Framework.Runtime.IFileMonitor
Microsoft.Framework.Runtime.IFileWatcher
Microsoft.Framework.Runtime.ILibraryManager
Microsoft.Framework.Runtime.ICompilerOptionsProvider
Microsoft.Framework.Runtime.IApplicationShutdown
Microsoft.AspNet.Hosting.IHostingEnvironment
Microsoft.Framework.Runtime.IProjectResolver
Microsoft.Framework.Logging.ILoggerFactory
Microsoft.Framework.Runtime.ICache
Microsoft.Framework.Runtime.ICacheContextAccessor
Microsoft.Framework.DependencyInjection.ITypeActivator
Microsoft.Framework.Runtime.IAssemblyLoadContextFactory

IHostingEnvironment 服務的使您能夠訪問 Web 根目錄路徑為您的應用程式 (通常是您的 www 資料夾) 並且 IFileProvider 抽象為您的 Web 根目錄。IProject­解析器可以用來找到您的解決方案中的其他專案。有日誌記錄和快取服務和依賴項注入意識型啟動劑。IAssemblyLoadCoNtextFactory 為您提供了一種用於創建新的程式集載入上下文的抽象。

您配置現有的服務,並在 ConfigureServices 方法中添加新的應用程式,在您的啟動類。ConfigureServices 方法需要可以添加額外的服務或者修改現有的 IServiceCollection。ASP.NET5 帶有簡單的內置的 IoC 容器中的託管進入點的圖層設置為引導系統,但您可以用您選擇的容器輕鬆地替換內置容器。

框架通常提供了用於將他們的服務添加到 IServiceCollection 添加擴充方法。例如,下面是如何添加ASP.NETMVC 6 所使用的服務:

public void ConfigureServices(IServiceCollection services)
{
  // Add MVC services to the services container
  services.AddMvc();
}

將服務添加到服務集合時,他們可以是三種類型之一:瞬態、 限定了作用域或單身人士。每次他們要請求從容器創建瞬態服務。僅當在當前範圍內已不存在時,才創建服務範圍。對於 Web 應用程式,所以你能想到的服務範圍,按要求為每個請求創建一個容器範圍。單例服務都永遠只創建一次。

Web.config 和 System.Configuration 樣式 app.config 檔中ASP.NET5 不受支援。 相反,ASP.NET5 配備了一個新的、 簡化的配置 API (Microsoft.Framework.ConfigurationModel,在 bit.ly/1yxC7gA) 用於處理配置資料。新的配置 API 允許您檢索和操作來自各種來源的配置資料。預設配置的提供程式也包括針對 JSON、 XML、 INI、 命令列參數和環境變數。您可以指定多個提供者和他們習慣在它們添加的順序。由支援基於環境的配置,你可以更輕鬆地部署到環境中的應用程式並讓它撿起那環境適當的設置。

要初始化的配置資料,請將您所需的配置提供程式添加到一個新的配置實例:

public Startup(IHostingEnvironment env)
{
  Configuration = new Configuration()
    .AddJsonFile("config.json")
    .AddEnvironmentVariables();
}

然後,您可以按名稱請求配置值:

string user = Configuration.Get("user");
string password = Configuration.Get("password");

您可以在您的應用程式使用期權模型以強型別的方式提供配置資料。選項只是普通的舊 C# 物件 (POCO) 類,有一大堆的屬性用於配置。你使選項可用在您的應用程式通過調用 AddOptions,添加 IOptions < 拓 > 到容器的服務。這項服務可以用於訪問不同類型的選項,無論支援依賴關係注入。

若要配置選項,您將添加 IConfigureOptions < TOptions > 向該容器提供服務。預設實現的 IOptions < 拓 > 服務會收集所有 IConfigure­選項 < 拓 > 服務,並使用它們來向消費者提供選項實例之前配置選項實例。作為添加選項配置邏輯的快捷方式,您可以使用配置 < 拓 > 方法,像這樣:

services.Configure<MvcOptions>(options => options.Filters.Add(
  new MyGlobalFilter()));

期權模型和配置模型工作手-­在手。你很容易可以將配置資料繫結到選項,所使用的配置實例,這樣的配置重載匹配的屬性名稱:

services.Configure<MyOptions>(Configuration);

請求處理

一旦 Web 服務器啟動時,它開始偵聽請求,並調用應用隨每個請求的管道。伺服器表面對每個請求作為公開一組細細微性的功能介面的伺服器環境物件。有功能介面發送檔、 Web 通訊端、 會話支援、 用戶端憑證和更多。你可以看到在 GitHub 的受支援的功能介面的完整清單 bit.ly/1Dh7eBC。例如,這裡是 HTTP 要求的功能介面:

[AssemblyNeutral]
public interface IHttpRequestFeature
{
  string Protocol { get; set; }
  string Scheme { get; set; }
  string Method { get; set; }
  string PathBase { get; set; }
  string Path { get; set; }
  string QueryString { get; set; }
  IDictionary<string, string[]> Headers { get; set; }
  Stream Body { get; set; }
}

你通常不直接針對各種代碼功能除­的面孔。Web 服務器使用功能介面公開給主機層的低級功能。承載層環繞在強型別的 HttpCoNtext,然後通過向應用程式中這些功能介面。這一級別的 Web 服務器、 主機層和應用程式之間的鬆散耦合允許伺服器實現,並重用而不必受制于一個特定的託管模式,並允許在不同的伺服器上承載的應用程式。ASP.NET5 是帶有直接上薄薄的 HTTP (Microsoft.AspNet.Server.IIS),在 IIS 上運行的內置支援。SYS 包裝 (Microsoft.AspNet.Server.Web­攔截器),和被稱為隼 (Microsoft.AspNet.Server.Kestrel) 的.NET 跨平臺 Web 服務器上。

用於.NET (浩然) 社會標準的開放 Web 介面 (owin.org) 共用相似的鬆散耦合的 Web 應用程式的目標。浩然標準化如何.NET 伺服器和應用程式應該互相交談。ASP.NET5 支援浩然通過 Microsoft.AspNet.Owin 包 (bit.ly/15IQwA5)。你可以承載ASP.NET5 浩然基於 Web 服務器上 (bit.ly/1DaU4FZ),並且您可以使用ASP.NET5 管道內的浩然中介軟體 (bit.ly/1EqmoIB)。

武士刀專案 (katanaproject.codeplex.com) 是微軟的最初努力實現支援浩然,和許多人的思想和觀念在ASP.NET5 來自它。武士刀了一個類似的模式,建立一個中介軟體的管道,在多個伺服器上託管。然而,與武士刀,不同的是,暴露出低級的浩然抽象直接給開發商,ASP.NET5 相反橋樑從浩然到更方便、 人性化的抽象。一點額外的代碼與您仍然可以使用武士刀中介軟體在ASP.NET5 浩然橋樑的使用 (請參見示例如何做到這一點在 bit.ly/1BpaXe2)。

接近尾聲了

5ASP.NET運行庫建成從地面到支援跨平臺 Web 應用程式。ASP.NET5 有一個靈活、 階層式體系結構,可以在.NET Framework 中,.NET 核心或單聲道 (和將來在.NET 核心以及 !) 甚至跨平臺上運行。新的ASP.NET5 承載模型很容易地編寫應用程式,它們駐留在您所選擇的 Web 服務器。整個運行時建立支援依賴注入,並要容易配置。過得開心學習有關新ASP.NET運行時 5 !您的回饋和捐款,歡迎通過在我們 GitHub 專案 github.com/aspnet/home


Daniel Roth 是ASP.NET團隊目前正致力於ASP.NET5 高級專案經理。 他的愛好包括.NET 開發和取悅客戶製作框架,簡單和容易使用。

感謝以下的微軟技術專家對本文的審閱:葛籣 · 康得倫、David福勒、 Murat Girgin 和ChrisRoss