次の方法で共有



August 2018

VOLUME 33 NUMBER 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 開発者向けの追加機能と同様に、パフォーマンスに優れたいくつか機能強化が提供しています。マイクロソフトは、3 年間の長期サポート (LTS) このリリースであることがサポートされている残りますも提供します。この記事では、ASP.NET Core 2.1 での機能強化の概要を示します。Julie Lerman、「Deep Dive に EF Core HasData シード処理」、列の過去 1 か月、EF Core 2.1 では、チェック アウト今月のデータ ポイントのコラムの新機能新機能に関する詳細 (msdn.com/magazine/mt847184) 新しい EF Core について詳しく説明します。2.1 では、型の機能は、結果を処理するキーのプロパティを持つ場合は true。 エンティティをしなくても、データベースを簡単に照会することができますを照会します。

Razor ページの機能強化

Razor ページでは、2017 年 9 月号で取り上げたを ASP.NET Core 2.0 で導入された新しい機能の改善点についての話から始めます (msdn.com/magazine/mt842512)。バージョン 2.1 は、ことでページ固有のフォルダーを共有アセットの検索のサポートなど、2.0 のリリースにはいくつかの機能を追加します。最も一般的な共有アセット ファイルのレイアウト、パーシャルです。既定では、これらが、ルート フォルダーに配置/Pages ASP.NET Core 2.0 では、ASP.NET Core MVC/Views/Shared フォルダー内に置かれた場合は、探索ことになります。バージョン 2.1 では、Razor ページ今すぐ検索共有ファイルを (順序) で、次の場所でそれらを探すことによって。

  1. 現在のページのフォルダー
  2. /ページ/共有
  3. /ビュー/共有

Razor ページは、既存の MVC ベースのアプリケーションに追加する場合は、必要に応じて簡単に共有アセットをオーバーライドすることができます、/Views/Shared フォルダーにある既存の共有資産の活用を続行できます。

Razor ページが最初に出荷されたときに欠落しているもう 1 つの機能は、区分のサポートをしました。ASP.NET Core 2.1 では、ASP.NET Core アプリケーションの/Areas フォルダーにある任意の場所に Razor ページの/Pages フォルダーを追加できます。Microsoft が「個々 のユーザー アカウントです」を選択するときに、id 機能の領域を使用する既定の Visual Studio Web アプリケーション テンプレートを更新しても

同時に、これらの機能を使用すると、プロジェクト システムでの Razor ページを整理するはるかに簡単です。

Razor の共有ライブラリ

2.1 では、もう 1 つの新しい機能は、個別のライブラリまたはパッケージから Razor 資産の読み込みのサポートです。個別の ASP.NET Core アプリは、多くの場合 (パスワードなど、登録、ログインを忘れた場合) の Id 機能などの一般的な資産を共有します。通常、多くの重複するコードでは、技術的負債の増加につながる個々 のプロジェクト間でこれらの一般的な機能がしました。新しい Razor クラス ライブラリ (RCL) 機能およびサポートする Razor ファイルのビルドに関連付けられているプロジェクトまたは ASP.NET Core アプリの任意の数が使用できる NuGet パッケージとして展開します。

この機能の追加により、コンパイラは自動的に参照されるライブラリとパッケージの関連するアセットの検索、Razor の資産を作成します。以前は、Razor の資産は、デプロイし、要求された後までをビルドでした。ASP.NET Core 2.1 では、Razor コンパイルをアプリの開始時間の短縮にもつながりますビルド プロセスに統合します。

プロジェクト間での一般的な資産を共有するためを使用する場合は、プロジェクトごとに特定の側面をカスタマイズする機能が失われないように、RCLs で razor 資産をオーバーライドできます。RCLs は、レイアウト、ナビゲーション、認証など、横断アプリの懸念事項の真価を発揮します。実際には、組み込みの ASP.NET Core Identity 機能より、プロジェクト間で再利用可能になるには、このサポートを活用することです。

プロジェクト テンプレートの更新

既定の Web アプリケーション プロジェクト テンプレートには、前述のないいくつかの変更が含まれています。新しいプロジェクト] ダイアログには、HTTPS を強制するかどうかを指定する] チェック ボックスが含まれています。プロジェクトは既定のプライバシーに関するページと cookie 同意 Razor パーシャルを含めるために、既定では、一般データ保護規則 (GDPR) 用の新しいサポートが含まれています。これらのドキュメントは単にプレース ホルダーに注意してください: は、組織の実際のポリシーを追加する必要があります。図 1個々 のユーザー アカウントの Id を使用するように構成されていますが、まったく新しい ASP.NET Core 2.1 プロジェクトを示しています。

ASP.NET Core 2.1 で新しい Web アプリケーションのプロジェクト構造
図 1 新しい Web アプリケーション プロジェクトの構造で ASP.NET Core 2.1

アドオンとしての id

前のバージョン 2.1、アプリでの ASP.NET Core Identity 機能を利用する場合は、一般に、Web アプリのプロジェクトを作成するときのサポートを追加する決定を行う必要があります。Id のサポートを後で追加する場合は、通常、プロセスになります ("個々 のユーザー アカウント") などの適切なサポートと新しい Web アプリ プロジェクトを作成し、既存のアプリに新しいアプリからファイルをコピーします。理想的なソリューションでした。

ASP.NET Core の難しい技術的な課題が常に (と ASP.NET のすぎます) に新しいアセットは、個別にパッケージ化と配置できないフロント エンドの Razor アセットがこのサポートに含まれているために、一部に、既存のアプリ Id のサポートを追加をサポートするために、既存のアプリ上の理由からのホストの失敗します。RCL サポートの追加により、既存のアプリに Id がはるかに簡単で、不要になったプロセスとして追加する既存のアプリに新しい Razor ファイルを追加する必要があります。

Visual Studio でスキャフォールディングのサポートを使用すると、既存のアプリに Id を追加します。最新のテンプレートで構築された新しいアプリなどの Id に関連するページ/ビュー、プロジェクト自体ではなく、共有の Razor アセットは活用します。このアプローチの利点は、定型コード ファイルの数を減らして、新しいプロジェクトが機能または動作をカスタマイズする機能を失うことがなく、です。見た図 1既定では Id のサポートのみ追加される領域が 1 つ _ViewStart.cshtml ファイルを使用します。追加] をクリックして、プロジェクトを右クリックして特定のファイルの動作をカスタマイズすることができます |スキャフォールディングされた新しい項目の Id をクリックしています。スキャフォールディングし、DbContext クラスとその他のオプションを指定するページを選択します。

SignalR にこれらのファイルのカスタマイズはいる方法を確認します。

強化された HTTPS のサポート

Web アプリに対して HTTPS を使用しているされていない場合可能性があります。検索エンジンとブラウザーは積極的に HTTPS を使用するサイトを昇格され安全でない可能性のあるとして扱うことをします。GDPR では、サイトで HTTPS を使用して、ユーザー プライバシーを保護することが必要です。ASP.NET Core 2.1 では、開発とテストのため、簡単にアプリを構築するときにローカルで HTTPS を使用や、HTTPS を使用してアプリのサポートを bolsters します。

初めて実行することで、.NET Core 2.1 SDK をインストールした後、開発証明書がインストールされます。Sdk がインストールされている新しい dotnet に dev-certs ツールを使用してこの証明書を管理することができます。開発証明書が信頼されていると、ことができますを開発およびテストの既定のプロトコルとして HTTPS を使用してローカルで、ASP.NET Core 2.1 アプリ (、もちろん使用している HTTPS)、運用環境をより密接にミラーリングします。

アプリケーションは、ブラウザーに HTTP Strict Transport Security (HSTS) をサポートしていることを通知することによって、セキュリティをさらに向上できます。HSTS は、特定の要求のすべての応答がプレーンな HTTP ではなく HTTPS 接続を使用する必要がありますをブラウザーに通知することによって、"man in the middle"攻撃などの攻撃の特定の種類を防止します。HSTS、せず、HTTPS 経由で提供されているページもには引き続き HTTP を使用するリソースが含まれます。これらのリソースを交換簡単または暗号化で保護されていないしているため、ユーザーと、コンテンツをホストするサーバーの間のルーターによって変更可能性があります。HSTS は、この攻撃を防ぎます。

HSTS は、元のリソースの HTTPS 応答で応答ヘッダーで実装されます。以下に例を示します。

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

HSTS は、既定では、アプリケーション テンプレートの Startup.cs ファイルで構成されているミドルウェアを使用して、ASP.NET Core アプリケーションに対して有効です。プロジェクトが運用環境で実行されているときに、既定の動作が、ミドルウェアにしか含まれているために、localhost の HSTS を使用する推奨されていません。

HSTS、に加えて新しい UseHttpsRedirection ミドルウェアを使用して、アプリケーションの HTTPS を要求することもできます。簡単に言うと、この有効にした、Startup.cs の Configure メソッドを次の行を追加することで。

App.UseHttpsRedirection();

今すぐはお勧めこのすべての ASP.NET Core アプリと Web アプリケーション テンプレートの既定の設定は。このミドルウェアは、HTTPS に HTTP 経由で到着した要求を自動的にリダイレクトされます。1 つだけをアプリで使用されていると仮定すると、適切な HTTPS ポートを検出するのに規則を使用します。または、ASPNETCORE_HTTPS_PORT 環境変数 (または http_port 構成キー) を設定するか、オプションを指定する ConfigureServices でコードを構成できます。

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

更新された SPA テンプレート

Angular と React のアプリの最新の推奨されるアプローチを使用するシングル ページ アプリケーション (Spa) のアプリケーション テンプレートが更新されました。具体的には、Angular テンプレートは、Angular のコマンド ライン インターフェイス (CLI) に基づいています、React テンプレートは、react のアプリの作成 (CRA) に基づいています。このような SPA フレームワークが頻繁に更新プログラムを配信、それらを使って作成する新しいアプリが現在のベスト プラクティスを使用して関連付けられている各フレームワークにより、最新のアプローチに組み込みのテンプレートを更新するようにします。

SignalR

SignalR では、ASP.NET アプリケーションにリアルタイム Web 機能を追加することが非常にシンプルな人気のあるライブラリです。ASP.NET Core SignalR は、ASP.NET Core 2.1 に付属する SignalR の新しいバージョンです。以前のバージョンに比べて機能が多数を機能します。

  • JQuery にないクライアント側の依存関係
  • バイナリ プロトコルの MessagePack ベース
  • Microsoft.AspNetCore.Sockets (Http ではなく) に基づく
  • (同じエンドポイント) から複数の形式をサポートしています

Microsoft.AspNetCore.SignalR NuGet パッケージには、SignalR のサーバー側コンポーネントが含まれます。このパッケージは、通常必要はありません (Microsoft.AspNetCore.App バージョン 2.1 以降を参照するいると仮定)、ASP.NET Core プロジェクトに個別に追加するために、Microsoft.AspNetCore.App メタパッケージに含まれます。SignalR では、Web ページと .NET アプリケーション用の .NET クライアントの JavaScript を含む、複数のクライアントをサポートします。JavaScript クライアントをプロジェクトに追加することをお勧めの方法は、npm です。Npm がインストールされている必要があると仮定すると、クライアントをプロジェクトに追加するには、次のコマンドを実行できます。

npm init –y
npm install @aspnet/signalr

最初のコマンドは、初期化、プロジェクトに packages.config-npm を使用していない場合は、次のコマンドを実行するだけで済みます。2 番目のコマンドは、node_modules フォルダーに SignalR JavaScript クライアントをダウンロードします。アプリから参照するために、ASP.NET Core アプリの wwwroot フォルダー内の適切な場所に node_modules から signalr.js ファイルをコピーする必要があります。

SignalR のデモ:トースト通知

新しい Identity パッケージの動作をカスタマイズする方法を表示しながら、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 と呼ばれる単純な通知ライブラリです。2 つ目は、node_modules から、アプリの wwwroot/ライブラリ/signalr フォルダーにコピー signalr.js ファイルです。最後には、新しい ASP.NET Core プロジェクトの一部として作成された既存の site.js ファイルです。これらのスクリプトの順序が重要です。

次の手順では、要求がサーバーから受信したときにメッセージを表示するために必要な JavaScript コードを追加する site.js の変更です。このプロセスでは、3 つの手順があります。最初に、接続する必要がありますを使用して作成、signalR.HubConnectionBuilder します。この型は、ビルダーのデザイン パターンを使用して必要なパラメーターとの接続を構成して、その接続がビルド メソッドから返されます。次に、接続の使用方法を使用してメッセージ ハンドラーを構成します。各動作をサーバーで開始できるようにするための 1 つの名前付きハンドラーを作成します。最後に、接続を開始するには、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 で起動します。SignalR (通常の後に含めるサービスを呼び出す ConfigureServices メソッドを変更する必要があります。。AddMvc):

services.AddSignalR();

次に、構成の方法でアプリを呼び出す直前に SignalR のルートを設定する必要があります。UseMvc:

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

ここは前述した UsersHub クラスを追加します。このクラスは、一般的なアプローチとなる、Hubs フォルダーに配置できますか"機能スライスの ASP.NET Core MVC 』、2016 年 9 月の記事で説明したように、機能フォルダーのアプローチの詳細を使用してについて考えることができます (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();
  }
}

場所でこれらの情報には、アプリケーションを実行し、アプリを表示する複数の異なるブラウザーを開きます。1 つは、登録し、アプリとの間に署名します。その他のブラウザーに表示される通知が表示されます。左半分図 3右側に、Edge ブラウザーとの間、ユーザーがサインアップした後、Chrome ブラウザーで表示通知が表示されます。

ASP.NET Core SignalR のサーバーから接続されているブラウザーに通知を送信
図 3 ASP.NET Core SignalR のサーバーから接続されているブラウザーに通知を送信

統合テストの機能強化

ASP.NET Core 1.0 以降の完全なスタック、インメモリのテストを統合するための優れたサポートとしました。ただし、いくつかのカスタム設定を実現するために必要なことの 1 つがように構成する、TestServer 適切なコンテンツのルート パスを正しくなどの Web アプリケーション内でビュー リソースを見つけることできます。ASP.NET Core 2.1 には、新しい型を TestServer とそれに接続する HttpClient を作成しやすく WebApplicationFactory < T > が導入されています。Xunit テスト クラス内で、ファクトリを使用するには、スタートアップはテストする ASP.NET Core アプリのエントリ ポイントです、IClassFixture < WebApplicationFactory < スタートアップ >> インターフェイスを実装します。次に、クラスのコンス トラクターは、WebApplicationFactory < Startup > を挿入して、その 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 ではなく、既定のトランスポート層のようになりました。この変更は、シームレスにする必要がありますが開発者が Kestrel で使用するための libuv を構成できますも、問題が発生する場合。

ASP.NET Core のホスティングのコンポーネントを別の新しい追加のホスト以外の Web パーツの構成を使用して、HostBuilder 型のです。HostBuilder は既存の WebHostBuilder によく似ていますが、Web プロジェクトからスタートアップ クラスを指定することはできません。依存関係の挿入、構成、およびホステッド サービスまたはコンソール アプリケーションのように Web 以外のシナリオのログ記録などの一般的な懸念事項を構成できるようになっています。

最後に、ASP.NET Core アプリで API エンドポイントを作成する場合は、2.1 で追加されたいくつかの機能強化の利点を実行できます。最初に、Api を公開するコント ローラーに [ApiController] 属性を追加することができます。これにより、さまざまな機能がなど、これらのコント ローラーで定義されているエンドポイントを追加します。

  • モデル検証エラーは BadRequest(ModelState) を自動的に戻る
  • アクション パラメーターに対して自動的に推論 [FromBody]) などのソースのバインド
  • [FromForm] を自動的に使用するファイルのアップロードがマルチパート/フォーム データ コンテンツの種類を推測します。
  • 属性のルーティングが必要です。

別の追加は、新しい戻り値の型、ActionResult < T > です。この戻り値の型は IActionResult の代わりに使用でき、メソッド シグネチャに含まれる型情報です。Swashbuckle などのツールは、この情報を使用して、OpenAPI/Swagger ドキュメントを生成できます。この戻り値の型せずにこの情報を公開する [ProducesResponseType] 属性を持つ IActionResult を単純に返されるメソッドに注釈を付ける必要があります。

次のステップ

ASP.NET Core 2.1 を使用していない場合、できるだけ早くアップグレードすることをお勧めします。SDK を入手することができますmicrosoft.com/net/download/windowsでイメージのいずれかから Docker を使用してツールを実行またはdockr.ly/2MAaiEFします。このサンプルの更新されたソース コードはbit.ly/2JXdHeVします。


Steve Smith独立系のトレーナー、指導者、およびコンサルタントです。彼のブログはardalis.com電子メールとでポッド キャストを使用して開発者向けのヒントを提供およびWeeklyDevTips.comします。クリーナー、開発する方法について Pluralsight でコースを受講する彼は、高品質なアプリケーションを確認します。Twitter で彼をフォロー: @ardalisします。


この記事について MSDN マガジン フォーラムで議論する