AddMvcCore()を使用して「純粋な」ASP.NET Core Web APIを実装する方法

裏切り:

AddMvc()サービスAddMvcCore()の制御により、使用が優れたオプションであることを認識せずに、デフォルトのサービスを使用するASP.NET Core Web APIプロジェクトをたくさん見ました

どのように正確にあなたが使用してASP.NETコアのWeb APIを実装しないAddMvcCore()、なぜそれが良いですか?

裏切り:

違いは何であるAddMvc()とはAddMvcCore()

最初に理解しておくべき重要なことは、AddMvc()がプリロードされたバージョンであることAddMvcCore()です。GitHubリポジトリでAddMvc()拡張機能の正確な実装を確認できます

私は次の人と同じくらいデフォルトのVSテンプレートを使用するのが好きですが、時々それが間違った選択であるかを知る必要があります。私はオンラインでいくつかのガイドを見てきましたが、これらのガイドを実装していないソリューションを使用するのではなく、これらのデフォルトサービスを「元に戻す」ことを目的としています。

ASP.NET Coreがオープンソースになったことで、「魔法」を失うことを恐れずにレイヤーを剥がして下位レベルで作業できない理由は、実際にはありません。


「最小」と「純粋」の定義

注:定義は、この回答のコンテキストのみを対象としています。ほとんどの場合、明確にするため、およびさらに理解を深めるためです。

この答えは、「最小」ではなく「純粋」に傾いています。その理由を説明したいと思いますので、私が話していることがより明確になります。

最小限。「最小限の」ソリューションは AddMvcCore() メソッドをまったく呼び出さない実装ですその理由は、MVCは実際に独自のWeb APIを組み立てるための「必須」コンポーネントではなく、追加の依存関係によってコードにある程度の重みが加わることです。このシナリオでは、AddMvcCore()メソッドを使用していないため、ここにアプリケーションに注入しません。

public void Configure(IApplicationBuilder app)
{
    app.UseMvc(); // you don't need this
}

これは、独自のルートをマッピングcontextし、独自の方法でに応答することを意味します。これはまったく難しいことではありませんが、かなり話題から外れているので、詳しくは説明しませんが、ここでは最小限の実装の小さな味を示します

public void Configure(IApplicationBuilder app)
{
    app.Map("/api", HandleMapApi);
    // notice how we don't have app.UseMvc()?
}    

private static void HandleMapApi(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        // implement your own response
        await context.Response.WriteAsync("Hello WebAPI!");
    });
}

多くのプロジェクトでは、「最小限の」アプローチとは、MVCにある機能の一部を放棄することを意味します。設計パターン、利便性、保守性、コードフットプリント、そして最も重要なのはパフォーマンスとレイテンシのバランスがあるため、実際にオプションを比較検討し、この設計パスが正しい選択かどうかを確認する必要があります。簡単に言えば、「最小限の」ソリューションとは、コードとリクエストの間のサービスとミドルウェアを最小限に抑えることです。

ピュア。「純粋な」ソリューション(この回答のコンテキストに関する限り)はAddMvc()、最初から実装しないことで、「事前バンドル」されているすべてのデフォルトサービスとミドルウェアを回避することです代わりAddMvcCore()に、次のセクションでさらに説明するを使用します


独自のサービス/ミドルウェアの実装 AddMvcCore()

最初にConfigureServices、を使用するように設定ますAddMvcCore()あなたが見ればGitHubのリポジトリには、その見ることができるAddMvc()の呼び出しをAddMvcCore()サービス/ミドルウェアの標準セットで:

以下は、「不要」と目立つサービス/ミドルウェアの一部です。

var builder = services.AddMvcCore();

builder.AddViews();
builder.AddRazorViewEngine();
builder.AddRazorPages();

これらのデフォルトサービスの多くは、一般的なWebプロジェクトには最適ですが、通常「純粋な」Web APIには望ましくありません。

以下は、Web APIのConfigureServices使用のサンプル実装ですAddMvcCore()

public void ConfigureServices(IServiceCollection services)
{
    // Build a customized MVC implementation, without using the default AddMvc(),
    // instead use AddMvcCore(). The repository link is below:
    // https://github.com/aspnet/Mvc/blob/release/2.2/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs

    services
        .AddMvcCore(options =>
        {
            options.RequireHttpsPermanent = true; // this does not affect api requests
            options.RespectBrowserAcceptHeader = true; // false by default
            //options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();

            // these two are here to show you where to include custom formatters
            options.OutputFormatters.Add(new CustomOutputFormatter());
            options.InputFormatters.Add(new CustomInputFormatter());
        })
        //.AddApiExplorer()
        //.AddAuthorization()
        .AddFormatterMappings()
        //.AddCacheTagHelper()
        //.AddDataAnnotations()
        //.AddCors()
        .AddJsonFormatters();
}

上記の実装はほとんどAddMvc()拡張メソッドの複製ですが、他の人がこれを行うことの追加の利点を見ることができるように、いくつかの新しい領域を追加しました。

  • カスタム入力/出力フォーマッタ。これは、JSON(またはより悪いXML)シリアライゼーションを使用する代わりに、独自に高度に最適化されたシリアライザ(Protobuf、Thrift、Avroなど)を実行できる場所です。
  • リクエストヘッダーの処理。Acceptヘッダーが認識されているかどうかを確認できます。
  • 承認の処理。独自のカスタム認証を実装することも、組み込み機能を利用することもできます。
  • ApiExplorer。一部のプロジェクトでは、それを含める可能性があります。そうでない場合、一部のWebAPIはこの機能を必要としません。
  • Cross-Origin Requests(CORS)。WebAPIでよりリラックスしたセキュリティが必要な場合は、それを有効にすることができます。

この「純粋な」ソリューションの例がうまくいけば、それを使用することの利点をAddMvcCore()理解し、使用に慣れることができます

ASP.NET CoreのWebホストで作業しているときにパフォーマンスとレイテンシの制御に真剣に取り組んでいる場合は、「最小限の」ソリューションの詳細を調べて、リクエストパイプラインの端で対処するのではなく、 MVCミドルウェアに行き詰まってしまいます。


追加の読書

ミドルウェアパイプラインがどのように見えるかを視覚的に見て...私の定義によれば、レイヤーが少ないということは「最小」を意味しますが、「純粋」はMVCのクリーンバージョンにすぎません。

ここに画像の説明を入力してください

詳細については、Microsoft Documents:ASP.NET Core Middleware Fundamentalsを参照してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

AddMvcCore()を使用して「純粋な」ASP.NET Core Web APIを実装する方法

分類Dev

AddMvcCore()を使用して「純粋な」ASP.NET Core Web APIを実装する方法

分類Dev

ASP.NET Core Web APIにHTTPキャッシュ(ETag)を実装する

分類Dev

ASP.NET Core Web APIにHTTPキャッシュ(ETag)を実装する

分類Dev

ASP.NET Core Web APIにHTTPキャッシュ(ETag)を実装する

分類Dev

ASP.NET Core Web APIでフィルタリングを実装するための最良の方法は何ですか?

分類Dev

JWTを使用してAsp.net Web APIに認証を実装する

分類Dev

asp.net web api2で依存性注入を実装する方法

分類Dev

.NET Core AngularVS2017テンプレートにangular-mdc-webを実装する方法

分類Dev

ASP.NET Core2.0でmachineKeyを実装する方法

分類Dev

ASP.NET Core2.2でIdentityを実装する方法

分類Dev

ASP.NET Core Web APIに新しいDelegatingHandlerを登録する

分類Dev

Web アプリで Web API を使用する .Net Core

分類Dev

.net Core 2.0にHttpContextを実装する方法は?

分類Dev

.net Core2.2でJWTトークンを実装する方法

分類Dev

Asp.Net Core2でPowerShellを使用してweb.configを変更する

分類Dev

dotnet core 3.1 Web APIでソートを実装するためのより良い方法はありますか?

分類Dev

ASP.NET MVC 5とWEB API 2にoauth2サーバーを実装する方法

分類Dev

Web API を呼び出す ASP .Net Core Web アプリ

分類Dev

VSTSを使用したASP.NET Core Web APIのCI / CD

分類Dev

ASP.net Web APIを使用してJSONを取得する方法は?

分類Dev

.NET Core 2.0 ConnectedServicesを使用してWebサービスを利用する方法

分類Dev

ASP.NET Core3.1でカスタムValidateAntiforgeryTokenAuthorizationFilterを実装する方法

分類Dev

.Net Core Web APIからJsonを返す方法は?

分類Dev

ASP.NET Core、テンプレートとしてクエリ文字列を使用するWeb API RouteAttribute

分類Dev

AddMvc()の代わりにAddMvcCore()を使用するASP.NET Core 2.0 Razor Pages

分類Dev

.net Core Web APIでデータ検証を構造化する方法は?

分類Dev

ASP.NET Core 3.1 Web API:httpsを使用してWindowsサービスとして自己ホストし、IISなどの証明書を使用できますか?

分類Dev

Return "raw" json in ASP.NET Core 2.0 Web Api

Related 関連記事

  1. 1

    AddMvcCore()を使用して「純粋な」ASP.NET Core Web APIを実装する方法

  2. 2

    AddMvcCore()を使用して「純粋な」ASP.NET Core Web APIを実装する方法

  3. 3

    ASP.NET Core Web APIにHTTPキャッシュ(ETag)を実装する

  4. 4

    ASP.NET Core Web APIにHTTPキャッシュ(ETag)を実装する

  5. 5

    ASP.NET Core Web APIにHTTPキャッシュ(ETag)を実装する

  6. 6

    ASP.NET Core Web APIでフィルタリングを実装するための最良の方法は何ですか?

  7. 7

    JWTを使用してAsp.net Web APIに認証を実装する

  8. 8

    asp.net web api2で依存性注入を実装する方法

  9. 9

    .NET Core AngularVS2017テンプレートにangular-mdc-webを実装する方法

  10. 10

    ASP.NET Core2.0でmachineKeyを実装する方法

  11. 11

    ASP.NET Core2.2でIdentityを実装する方法

  12. 12

    ASP.NET Core Web APIに新しいDelegatingHandlerを登録する

  13. 13

    Web アプリで Web API を使用する .Net Core

  14. 14

    .net Core 2.0にHttpContextを実装する方法は?

  15. 15

    .net Core2.2でJWTトークンを実装する方法

  16. 16

    Asp.Net Core2でPowerShellを使用してweb.configを変更する

  17. 17

    dotnet core 3.1 Web APIでソートを実装するためのより良い方法はありますか?

  18. 18

    ASP.NET MVC 5とWEB API 2にoauth2サーバーを実装する方法

  19. 19

    Web API を呼び出す ASP .Net Core Web アプリ

  20. 20

    VSTSを使用したASP.NET Core Web APIのCI / CD

  21. 21

    ASP.net Web APIを使用してJSONを取得する方法は?

  22. 22

    .NET Core 2.0 ConnectedServicesを使用してWebサービスを利用する方法

  23. 23

    ASP.NET Core3.1でカスタムValidateAntiforgeryTokenAuthorizationFilterを実装する方法

  24. 24

    .Net Core Web APIからJsonを返す方法は?

  25. 25

    ASP.NET Core、テンプレートとしてクエリ文字列を使用するWeb API RouteAttribute

  26. 26

    AddMvc()の代わりにAddMvcCore()を使用するASP.NET Core 2.0 Razor Pages

  27. 27

    .net Core Web APIでデータ検証を構造化する方法は?

  28. 28

    ASP.NET Core 3.1 Web API:httpsを使用してWindowsサービスとして自己ホストし、IISなどの証明書を使用できますか?

  29. 29

    Return "raw" json in ASP.NET Core 2.0 Web Api

ホットタグ

アーカイブ