2018 年 8 月

第 33 卷 8

本文章是由機器翻譯。

ASP.NET Core-ASP.NET Core 2.1 中最新消息

藉由Steve Smith

Microsoft 最近發行了.NET Core 2.1 及 Entity Framework (EF) Core 2.1 的 ASP.NET Core 2.1。這些版本結合,提供一些很顯著的效能,以及其他功能改善適用於.NET Core 開發人員。Microsoft 也提供長期支援 (LTS) 版本中,這表示它仍會持續支援三年。本文提供在 ASP.NET Core 2.1 中改進的概觀。若要深入了解 Julie Lerman、"深入了解到 EF Core HasData 植入 」 和她的資料行上個月的 EF Core 2.1 中,請參閱本月份的資料點的資料行中的新功能 (msdn.com/magazine/mt847184),深入探討新的 EF Core2.1 查詢類型功能,可讓您更輕鬆地查詢資料庫,而不需要具有索引鍵的屬性,以取用結果,則為 true 的實體。

Razor Pages 增強功能

首先我要藉由談論 Razor 頁面,在我撰寫了關於在 2017 年 9 月期的 ASP.NET Core 2.0 中引進的新功能的增強功能 (msdn.com/magazine/mt842512)。版本 2.1 新增幾個未變成 2.0 版本中,例如特定頁面的資料夾,以搜尋共用的資產支援的功能。最常見的共用的資產是版面配置檔案和部分。根據預設,這些位於根 /Pages 資料夾,在 ASP.NET Core 2.0 中,雖然它們被放入 /Views/Shared 資料夾時,ASP.NET Core MVC 會探索它們。2.1 版,Razor 頁面現在會搜尋這些共用的檔案中 (依順序) 的下列位置尋找它們:

  1. 目前的 Pages 資料夾
  2. / / 共用頁面
  3. / 檢視/共用

這可讓您輕鬆地覆寫共用的資產,其中有需要,但如果您要新增至現有的 MVC 型應用程式的 Razor 頁面,您可以繼續利用它在其 /Views/Shared 資料夾中有任何現有共用的資產。

遺漏一開始隨附的 Razor 頁面時支援區域的另一項功能。ASP.NET Core 2.1 中,您現在可以將 /Pages 資料夾中的,使用 Razor 頁面加入 /Areas 資料夾的 ASP.NET Core 應用程式中的任何區域。Microsoft 也已更新預設 Visual Studio Web 應用程式範本,若要使用的身分識別功能的區域,當您選擇 「 個別使用者帳戶 」。

在一起,這些功能讓組織 Razor 頁面專案系統中更輕鬆。

共用的 Razor 程式庫

2.1 中的另一個新功能是支援從不同的程式庫或套件載入 Razor 資產。個別的 ASP.NET Core 應用程式通常會共用通用的資產,例如身分識別功能 (登入、 註冊、 忘了密碼等等)。一般而言,這些常見的功能會導致許多重複的程式碼在個別的專案,導致增加的技術債務。新增 Razor 類別庫 (RCL) 功能支援建置 Razor 檔案並將其部署為相關聯的專案或任何數目的 ASP.NET Core 應用程式可以取用的 NuGet 套件。

透過這項功能,編譯器會建置 Razor 資產,會自動搜尋中參考的程式庫和套件的相關資產。先前,Razor 資產未建立直到他們已部署,並要求之後。ASP.NET Core 2.1 將 Razor 編譯整合建置流程中,也會導致更快速的應用程式啟動時間。

RCLs 中的 razor 資產可以被覆寫,因此您可以使用它們來共用常見的資產專案之間,如果您不會遺失自訂每個專案為基礎的某些方面的能力。RCLs 更亮眼的版面配置、 瀏覽及驗證等跨領域的應用程式考量。事實上,內建的 ASP.NET Core 身分識別功能是能夠利用這項支援,才能在專案之間,也更能重複使用。

專案範本的更新

預設 Web 應用程式專案範本包含不是先前所述的一些變更。新增專案] 對話方塊現在包含核取方塊,指定是否要強制使用 HTTPS。根據預設,隨附的一般資料保護規定 (GDPR) 的新支援,因此專案現在會包含預設隱私權和 cookie 同意 Razor 部分。請注意,這些文件只是預留位置,您必須負責將貴組織的實際的原則。[圖 1顯示已設定為使用針對個別使用者帳戶的身分識別的全新 ASP.NET Core 2.1 專案。

ASP.NET Core 2.1 中新的 Web 應用程式專案結構
[圖 1 新 Web 應用程式的專案結構在 ASP.NET Core 2.1 中

身分識別為附加元件

如果您想要利用之前的版本 2.1 應用程式中的 ASP.NET Core 身分識別功能,您通常必須判斷是否要加入它的支援,當您建立 Web 應用程式專案。如果您想要稍後新增身分識別支援,通常會是使用適當的支援 (例如 「 個別使用者帳戶 」),建立全新的 Web 應用程式專案,並從新的應用程式將檔案複製到您現有的應用程式的程序。這不是理想的解決方案。

它們都是艱難的技術挑戰,適用於 ASP.NET Core (和 ASP.NET,太) 為部分支援新增至現有的應用程式的識別身分支援,因為這項支援包含前端無法分別封裝並部署到新的資產的 Razor 資產現有的應用程式可能會失敗的原因眾多。RCL 支援加入,加入至現有的應用程式的身分識別就容易多了,以處理程序不再需要將新的 Razor 檔案新增至現有的應用程式。

您可以使用 Visual Studio 中的 scaffolding 支援新增至現有的應用程式的身分識別。共用的 Razor 資產,而不是包括身分識別相關頁面/檢視專案本身中,將會利用最新的範本以建置的新應用程式。此方法的優點是較少的模板檔案在新的專案中,但不會遺失在功能或您自訂行為的能力。您在中所見**[圖 1** ,根據預設身分識別支援只會將區域與單一的 _ViewStart.cshtml 檔案。您可以自訂行為的某些檔案以滑鼠右鍵按一下專案,按一下 [新增 |新增 Scaffold 項目,然後選擇 [身分識別。選取您想要建立的結構,並指定 DbContext 類別及任何其他選項的頁面。

您會看到如何我要自訂這些檔案時取得 signalr。

改善的 HTTPS 支援

如果您的 Web 應用程式尚未使用 HTTPS,您可能應該。搜尋引擎和瀏覽器現在正在升級使用 HTTPS 的站台,並將那些不視為可能不安全。GDPR 要求網站使用 HTTPS 來保護使用者隱私權。ASP.NET Core 2.1 加快開發和測試應用程式使用 HTTPS,包括使它更容易建置應用程式時,在本機上使用 HTTPS 的支援。

安裝.NET Core 2.1 SDK 中,第一次執行之後,它會安裝開發憑證。您可以管理使用新的 dotnet 開發人員憑證工具,會隨 SDK 一起安裝此憑證。一旦開發憑證受到信任,就能夠開發和測試您的 ASP.NET Core 2.1 應用程式,在本機使用 HTTPS,為您的預設通訊協定,更密切鏡像實際執行環境 (當然您使用 HTTPS)。

您的應用程式可以藉由發出訊號給瀏覽器可支援 HTTP Strict Transport Security (HSTS),進一步改善其安全性。HSTS 可協助防止特定種類的攻擊,例如 「 中間人 」 攻擊,藉由指定要求的所有回應必須都使用 HTTPS 連線,而不是一般 HTTP 瀏覽器發出訊號。沒有 HSTS,甚至會提供透過 HTTPS 的頁面可能會包含資源仍在使用 HTTP。這些資源無法輕鬆地取代或修改使用者和內容,裝載的伺服器之間的路由器,因為它們未受保護的加密。HSTS 可防止此攻擊。

透過回應標頭在 HTTPS 回應的原始的資源中實作 HSTS。例如:

Strict-Transport-Security: max-age=16070400; includeSubDomains

HSTS 會啟用使用中介軟體,在應用程式範本的 Startup.cs 檔案的預設設定的 ASP.NET Core 應用程式。不建議在 localhost,使用 HSTS,因此預設行為只包含中介軟體,在生產環境中執行專案時。

除了 HSTS,您也可以使用新的 UseHttpsRedirection 中介軟體應用程式需要 HTTPS。簡單來說,您啟用這藉由將您的設定方法,在 Startup.cs 中的下面這一行:

App.UseHttpsRedirection();

Microsoft 現在建議這所有的 ASP.NET Core 應用程式,而且 Web 應用程式範本中的預設值。此中介軟體會自動重新導向有透過 HTTP 至 HTTPS 的要求。它會使用慣例來探索是適當的 HTTPS 連接埠,假設只有一個正由應用程式。或者,您可以設定藉由設定 ASPNETCORE_HTTPS_PORT 環境變數 (或 http_port 組態機碼),或藉由在 ConfigureServices 中的程式碼中指定的選項:

services.AddHttpsRedirection(options => options.HttpsPort = 5555);

已更新的 SPA 範本

單一頁面應用程式 (Spa) 應用程式範本已更新的 Angular 和 React 應用程式使用最新的建議的方法。具體來說,Angular 範本現在會根據 Angular 的命令列介面 (CLI) 和 React 範本為基礎建立 react-應用程式 (CRA)。這些 SPA 架構頻繁交付更新,因此內建範本更新至最新的方法可協助確保新的應用程式使用它們建置會使用目前的最佳做法相關聯的每個架構。

SignalR

SignalR 是熱門的程式庫,可將即時 Web 功能新增至 ASP.NET 應用程式非常簡單。ASP.NET Core SignalR 是 ASP.NET Core 2.1 SignalR 隨附的新版本。它比舊版功能有不少改進功能:

  • 在 jQuery 沒有用戶端相依性
  • MessagePack 為基礎的二進位通訊協定
  • 根據 Microsoft.AspNetCore.Sockets (非 Http)
  • 支援多種格式 (從相同的端點)

SignalR 的伺服器端元件都包含在 Microsoft.AspNetCore.SignalR NuGet 套件。此套件隨附於 Microsoft.AspNetCore.App 中繼套件,因此您通常應該不需要將它分別新增至您的 ASP.NET Core 專案 (假設您正在參考 Microsoft.AspNetCore.App 2.1 或更新版本)。SignalR 支援多個用戶端,包括 JavaScript 的網頁和.NET 應用程式的.NET 用戶端。若要加入專案中的 JavaScript 用戶端的建議的方式是透過 npm。假設您有安裝 npm,您可以執行下列命令來將用戶端新增至您的專案:

npm init –y
npm install @aspnet/signalr

第一個命令會初始化 packages.config,為您的專案,您只需要執行此命令,如果您還沒使用 npm。第二個命令會下載至您的 node_modules 資料夾 SignalR JavaScript 用戶端。您必須將 signalr.js 檔案從 node_modules 複製到 ASP.NET Core 應用程式的 wwwroot 資料夾中的適當位置,才能從您的應用程式參考它。

SignalR 示範:快顯通知

若要示範如何設定與 SignalR,同時也顯示如何自訂新的身分識別封裝中,行為是多麼我建立了簡單的示範。它會跳出瀏覽器中的通知,每當使用者註冊或登入或移出應用程式。此通知應該出現任何位置上站台,因此我要修改 _Layout.cshtml 檔案,以包含必要的用戶端指令碼。_Layout.cshtml 檔案的底部加入下列內容:

<script src="//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/
  toastr.min.js"></script>
<script src="~/lib/signalr/signalr.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>

第一個參考是一個稱為 toastr 我要用來顯示通知的簡單通知程式庫。第二個是從 node_modules 複製到應用程式的 wwwroot/lib/signalr 資料夾 signalr.js 檔案。最後一個是現有 site.js 檔案建立新的 ASP.NET Core 專案的一部分。這些指令碼的順序很重要。

下一個步驟是修改 site.js 將顯示訊息,從伺服器收到要求時所需的 JavaScript 程式碼。有三個步驟程序。首先,必須建立連線,使用 signalR.HubConnectionBuilder。此類型會使用 「 產生器 」 設計模式來使用任何必要的參數,來設定連線,則連接會傳回從建置方法。接下來,您可以設定在連接上使用.on 方法的訊息處理常式。建立一個具名處理常式,針對每個您想要能夠起始伺服器的行為。最後,您會藉由呼叫其 start 方法起始連線:

const userUpdatesConnection = new signalR.HubConnectionBuilder()
  .withUrl("/userUpdates")
  .build();
userUpdatesConnection.on("ReceiveSignIn", (user) => {
  toastr.options.escapeHtml = true;
  const message = user + " logged in.";
  toastr.info(message, "New Login!");
});
// Additional handlers omitted
userUpdatesConnection.start().catch(err => console.error(err.toString()));

此程式碼會使用 _Layout.cshtml 每一頁上執行。現在我將設定伺服器端的連接,在 Startup.cs 中啟動。您需要修改的 ConfigureServices 方法,後面加入.scm SignalR (通常是呼叫服務。AddMvc):

services.AddSignalR();

接下來,在 Configure 方法中,您需要之前呼叫應用程式設定 SignalR 的路由。UseMvc:

app.UseSignalR(routes =>
{
  routes.MapHub<UsersHub>("/userUpdates");
});
app.UseMvc();

現在就可以開始加入我之前提及 UsersHub 類別。您可以將此類別放在中樞資料夾中,也就是常見的方法,或您可以考慮使用多個功能資料夾的方法,如我在 2016 年 9 月篇文章中,「 功能配量的 ASP.NET Core MVC 」 所述 (msdn.com/magazine/mt763233),並將它運作的頁面/控制站的中樞。在任何情況下,此案例中,因為用戶端不進行呼叫至中樞,此類別不需要任何實際的實作。它只需要繼承自 Microsoft.AspNetCore.SignalR.Hub:

public class UsersHub : Hub
{
}

最後,若要使用中樞連線的用戶端從其他地方與通訊在應用程式,您使用相依性插入來插入 IHubContext < THub > 至需要的類別。在此情況下,登入、 登出和註冊每個 PageModel 類別有 IHubContext < UsersHub > 插入至其建構函式的執行個體。

若要傳送訊息時,使用 HubContext 執行個體存取它的用戶端屬性,並將訊息傳送至特定的具名處理常式。[圖 2顯示登出 PageModel OnPost 方法的實作。

[圖 2 實作登出 PageModel OnPost 方法

public async Task<IActionResult> OnPost(string returnUrl = null)
{
  string username = User.Identity.Name;
  await _signInManager.SignOutAsync();
  _logger.LogInformation("User logged out.");
  await _usersHubContext.Clients.All.SendAsync("ReceiveSignOut", username);
  if (returnUrl != null)
  {
    return LocalRedirect(returnUrl);
  }
  else
  {
    return Page();
  }
}

使用這些部分之後,您可以執行應用程式,並開啟數個不同的瀏覽器,以顯示應用程式。在其中一個,註冊並登入和登出應用程式。您應該會看到通知出現在其他瀏覽器中。左的半部**[圖 3**顯示出現在 Chrome 瀏覽器中之後使用者已簽署流入和流出的 microsoft Edge 瀏覽器,在右邊, 的通知。

若要連線的瀏覽器,從伺服器傳送通知的 ASP.NET Core SignalR
[圖 3 ASP.NET Core SignalR 連線的瀏覽器,從伺服器傳送通知

整合的測試改善

ASP.NET Core 已整合自 1.0 起測試完整堆疊在記憶體中的絕佳支援。不過,需要一些自訂的安裝程式,以達到的一件事設定 TestServer 使用適當的內容根目錄的路徑、 使它無法正確地找出資源,例如 Web 應用程式內的檢視。ASP.NET Core 2.1 引進了新的類型,WebApplicationFactory < T >,可讓您更輕鬆地建立 TestServer 和 HttpClient 連線到它。若要使用 Xunit 測試類別內的處理站,您可以實作 IClassFixture < WebApplicationFactory < 啟動 >> 介面,啟動其中是您想要測試 ASP.NET Core 應用程式的進入點。然後,在類別建構函式中,您可以插入 WebApplicationFactory < 啟動 >,並使用其 CreateClient 方法來取得用戶端的執行個體。在您的測試,您可以再使用用戶端應用程式提出要求,並驗證,則會傳回正確的回應,就像這樣:

[Fact]
public async Task Get_HomePageReturnSuccessAndCorrectContentType()
{
  var response = await _client.GetAsync("/");
  response.EnsureSuccessStatusCode(); // Status Code 200-299
  Assert.Equal("text/html; charset=utf-8",
    response.Content.Headers.ContentType.ToString());
}

如果您需要自訂應用程式進行測試,例如變更其可用的服務,或新增將用於測試的種子資料,您還可以繼承自 WebApplicationFactory < T >,並接著在測試中使用您自訂的處理站。

其他增強功能

此版本也會看到的 ASP.NET Core 2.1,包括內建的 Kestrel 伺服器的其他幾個部分的增強功能。Kestrel 現在會使用其預設傳輸層,而不是 libuv 受管理的通訊端。這項變更應該順暢,但它會導致問題,如果開發人員仍然可以設定用於 libuv 與 Kestrel。

另一個新的主機元件的 ASP.NET Core 是新增 HostBuilder 類型,您會用來設定主控件的非 Web 組件。HostBuilder 現有 WebHostBuilder,非常類似,但不允許您指定 Web 專案的啟動類別。它設計成可讓您設定一般的關注,例如相依性插入、 組態和非 Web 案例,例如託管的服務或主控台應用程式的記錄。

最後,如果您要撰寫 API 端點,在 ASP.NET Core 應用程式中,您可以利用 2.1 中新增一些改善項目。首先,您可以將 [ApiController] 屬性加入任何您公開 Api 的控制器。這會將多種功能,將這類定義這些控制站上的端點:

  • 模型驗證錯誤會自動傳回 BadRequest(ModelState)
  • 自動推斷動作參數的繫結來源 (例如 [FromBody])
  • 檔案上傳使用 [FromForm] 會自動推斷 multipart/form-data 內容類型
  • 屬性路由是必要

另一項改進是新的傳回類型,稱為 ActionResult < T >。這個傳回型別來取代 IActionResult,並允許要包含在方法簽章中的型別資訊。Swashbuckle 之類的工具可以使用這項資訊來產生 OpenAPI/Swagger 文件。沒有此傳回型別,您必須加上註解只是傳回 IActionResult [ProducesResponseType] 屬性來公開此資訊的方法。

後續步驟

如果您未使用 ASP.NET Core 2.1,建議您儘速升級。您可以取得在 SDK microsoft.com/net/download/windows或執行使用其中一個在映像的 Docker 工具dockr.ly/2MAaiEF。此範例的更新的原始程式碼位於bit.ly/2JXdHeV


Steve Smith是獨立的培訓講師、 導師和顧問。在他的部落格ardalis.com ,並提供透過電子郵件和 podcast,在開發人員秘訣WeeklyDevTips.com。請針對 Pluralsight,若要了解如何開發俐落,他課程更高品質的應用程式。在 Twitter 上關注與他連絡: @ardalis


MSDN Magazine 論壇中的這篇文章的討論