1. ホーム
  2. Web プログラミング
  3. ASP.NET

ASP.NET Core Web API チュートリアル プロジェクト構成図

2022-01-14 01:28:59

まえがき

本連載は、主に書籍「究極のASP.NET Core 3 Web API」を参考に、原文を翻訳しつつ、内容の一部を適切に削除・修正したものです。

一部の概念や原理については、原著や本記事で詳しく説明していないため、詳しく紹介すると内容が肥大化し、分かりづらくなってしまいます。

私の技術力と英語力には限界があるため、また、主に今後の私自身のレビューを容易にするため、ご批判と間違いがあれば訂正をお願いします。

 プロジェクト構成

この記事の紹介 Configuration 開発中にアプリケーションをどのように構成するかを理解することは非常に重要です。.NET Frameworkのプロジェクトでは、通常、web.configファイルを通してアプリケーションを設定しますが、.NET Coreでは、このファイルを使用しなくなり、代わりに.NET Frameworkを使用します。 {.NET Coreでは、そのファイルを使用する代わりに、.NET Coreを使用します。 .NET Core 内蔵の {.NETコアコンフィギュレーション フレームワークを使用します。本記事では、その Startup クラスを作成し、これらのメソッドを通じてアプリケーションを設定する方法について説明します。さらに、サービスを登録する方法と、メソッドを拡張して登録する方法についても説明します。

1. 新規プロジェクトの作成

Visual Studio 2019 を開き、[新規プロジェクトの作成] をクリックし、[ASP.NET Core Web API] を選択します。

プロジェクト名を記入し、プロジェクトのパスを選択します。

画像

次に、対象のフレームを選択し、[作成]をクリックします。

画像

2. launchSettings.jsonファイル

プロジェクトが正常に作成された後 Properties ノードで launchSettings.json ファイルです。

このファイルでは ASP.NET Core アプリケーションの起動時の動作を見てわかるように、IIS と自前でホストしているアプリケーション ( self-hosted の起動設定に関連するコンフィギュレーションを表示します。

Kestrel 

今回はWeb APIプロジェクトを開発しているので、ブラウザを使ってWebプロジェクトのようにAPIを表示する必要はありません。後でPostman(後述)を使ってAPIを呼び出し、その出力を表示する予定です。また、アプリケーションの起動時にブラウザが自動的に開かないようにするために {{コード プロパティに { "$schema": "http://json.schemastore.org/launchsettings.json", "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:59126", "sslPort": 44389 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "weatherforecast", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "CompanyEmployees": { "commandName": "Project", "launchBrowser": true, "launchUrl": "weatherforecast", "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } } :

{{コード

プロジェクト作成時に launchBrowser のチェックボックスをオンにすると false ノードには、HTTP 用と HTTPS 用の 2 つの URL が含まれます。 このとき

なお、この この HTTPS 設定項目はローカル環境でのみ有効であり、アプリケーションを正式にデプロイした後は、実際の有効な証明書を使用して設定する必要があります。

ローカルでアプリケーションを開発する場合、もう1つ重要な属性があります。 "launchBrowser": false
/
このプロパティを動作させるためには

Configure for HTTPS 

メソッドは、プロジェクトのデフォルトの設定ファイルと変数、およびロギングプロバイダを設定します。アプリケーションの起動プロセスの早い段階でロギングプロバイダを設定することは、起動プロセス中に発生した問題を記録するためにログを使うことができることを意味します。

その後 {コード () メソッドで初期化します。 applicationUrl クラスを作成します。 launchUrl のクラスがあります。 launchBrowser クラスはプロジェクトに必須のクラスで、アプリケーションに必要な組み込みサービスやカスタムサービスを設定する必要があり、以下のようなコードで設定します。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

ここで、メソッド名が示すように CreateDefaultBuilder(args) メソッドは、アプリケーションに機能を追加する再利用可能なコードの断片である、アプリケーションが使用するサービスを設定するために使用されます。このメソッドでは webBuilder.UseStartup() メソッドを使用すると、アプリケーションのリクエストパイプラインにさまざまなミドルウェアを追加できます。 その

大規模なアプリケーションでは、多くの異なるサービスが含まれる可能性があるため Startup メソッドを使用すると、大量のコードになり、見た目も混乱し、扱いにくく、可読性も悪くなります。コードの可読性を高めるには、サービスを追加するコードを個々の拡張メソッドに分離すればよいのです。

4. エクステンションメソッドとCORS設定

拡張メソッドは、基本的に静的メソッドです。他の静的メソッドと異なるのは、最初の引数としてこれを受け付けることで、これは拡張メソッドを使用するオブジェクトのデータ型を表しています。

は、その

拡張メソッドは静的クラスで定義する必要があり、.NETの型の挙動を拡張します。拡張メソッドが定義されると、同じ型のオブジェクトに対してそのメソッドの呼び出しを複数回連鎖させることができるようになります。

次に、プロジェクト内に新しいフォルダを作成し、コードを書き始めます。{{p 拡張機能

画像

次に、そのフォルダーにクラスを作成します。 Startup で、このクラスを次のコードで静的クラスに変更します。

 ASP.NET Core Web API 
{

次のステップでは、静的クラスがどのように使用されるべきかを確認するために、特定の機能の実装を開始します。最初に行いたいのは、アプリケーションで CORS を設定することです。 public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services) { services.AddControllers(); AddControllers(); } // Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } ( ConfigureServices() )は、異なるドメインのアプリケーションにアクセスを許可または制限するためのメカニズムです。

異なるドメインからアプリケーションにリクエストを送信する場合は、CORS を設定する必要があるので、次のステップで Configure() クラスを使用して、すべてのドメインからのすべてのリクエストを私たちの API に送信できるようにします。 ConfigureServices()

{{コード
 ServiceExtensions 

public static class ServiceExtensions { }

{{コード CORS {{コード {{コード {{コード

{{コード

{{コード Cross-Origin Resource Sharing {{コード

{{コード
ServiceExtensions 

public static void ConfigureCors(this IServiceCollection services) =>
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy", builder =>
        {
            builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader();
        });
    });

We're using the basic CORS policy setup here for now, since for now all sources are allowed ( 
origin 
), all types of methods, and all header is acceptable. But if it's a production environment, then we should make the policy as strict as possible.
When necessary, we can use the WithOrigins("https://example.com") method to restrict requests to a specific source, rather than AllowAnyOrigin() to allow requests from all sources. Similarly, you can use the
 WithMethods("POST", "GET") 
method to restrict the request to a specific HTTP method, rather than using the 
AllowAnyMethods() 
method to allow all types of HTTP methods. Alternatively, you can use the
 WithHeaders("accept", "content-type")
 method to restrict the request to include a specific 
headers
.
5. IIS configuration
ASP.NET Core
 The application is self-hosted by default (
self hosted
), but we can of course configure the IIS integration to help us host the application using IIS, which can be done by adding the following extensions.
public static void ConfigureIISIntegration(this IServiceCollection services) =>
    services.Configure<IISOptions>(options =>
    {

    });


For now, we are fine with the default configuration, so we do not initialize any properties of options in the above code. If you want to change something, you can refer to the official documentation: At this point, we've written the extension methods for supporting CORS and IIS integration, and the next step is to add the 
Startup 
class, noting the namespace references 
Extensions , ConfigureService()
The code is as follows.
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // custom extension methods
    services.ConfigureCors();
    services.ConfigureIISIntegration();
    
    services.AddControllers();
}


For the direct in 
ConfigureServices() 
method, the use of extension methods makes the code more concise and readable. It is also important to name the extension methods as accurately and clearly as possible.
We've successfully added CORS and IIS configuration to the application's service container, but we haven't actually used these services yet, so we still need to add them to the 
Configure() 
method to add some code that uses the services.
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    //custom pipeline start
    app.UseStaticFiles();

    app.UseCors("CorsPolicy");

    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.All
    All });
    //custom pipeline end

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}



where
UseForwardedHeaders() 
: The forwarded 
header 
The matching field to be applied to the current request. By convention, the HTTP proxy forwards messages from the client in the well-known HTTP header. The middleware reads these 
header 
and populates them with 
HttpContext 
on the relevant fields.
UseStaticFiles() 
Enables the static file service for the current requested path, meaning that files in the current directory can be accessed via the path. If the path to the static file directory is not set, the wwwroot directory will be used by default.
UseCors() 
: Adds CORS middleware to the application's request pipeline to allow cross-domain requests.
6. Other code in the Startup class
ConfigureServices() 
method in the
AddControllers()
 : Adds the controller's services to the service collection. 
AddMvc() 
method can also add controllers to the service collection, but it adds views and pages to the service collection in addition to controllers. Our project is a Web API project, so only the controller is needed.
Configure() method.
UseRouting() 
: Add the routing middleware to the request pipeline.
UseAuthorization() 
: Adds authorization middleware to the request pipeline.
UseEndpoints() 
: Adds an endpoint to the controller's Action and adds the endpoint to the route.
7. Environment-based settings
When developing applications, we use the development (
development
) environment, and once we have released the application we need to use the production (
production
) environment. The development environment and the production environment correspond to different URLs, ports, connection strings, passwords, and other sensitive information. So we need to differentiate the configuration based on the environment, which is easy to implement in .
{NET Core.
When we create a project, we can see in the root of the project
 appsettings.json 
file, which is our main configuration file, and by clicking on the arrow in front of the file you can see a
 appsettings.Development.json 
file. If you open the project directory in the system's file explorer, you can see that these are two different files, but in the
 Visual Studio 
in Visual Studio /code, the two configuration files are associated together.

appsettings.{EnvironmentSuffix}.json is the configuration file used for a specific environment and can override the appsettings.json file. For example If appsettings.{EnvironmentSuffix}.json file contains the same configuration as the appsettings.json file with the same name, the value of the key-value pair will be overwritten. In addition we can customize specific environments, for example, for a production environment we can add another file: appsettings.Production.json.

appsettings.Production.json The file should contain configuration items for the production environment.

In order to set up the application runtime environment, we need to set the ASPNETCORE_ENVIRONMENT environment variable. For example, if you want the application to run in a production environment, you need to change the value of the above environment variable on the deployed machine to Production . In a Windows environment, this can be done by entering the command: set ASPNETCORE_ENVIRONMENT=Production to achieve this. In a Linux environment, this can be done by entering the command: export ASPNET_CORE_ENVIRONMENT=Production to achieve this.

The ASP.NET Core application uses the values of the above environment variables to determine which appsettings.json file to use, for example in a production environment, it will use appsettings.Production.json file. By default under ASPNETCORE_ENVIRONMENT variable is the value of the Development that opens the launchSettings.json file to see.

Logging is a very important feature for application development, both in development and after deployment, logging helps us to find and record problems, and we can locate, reproduce and fix them based on logs, so it is necessary to add logging services to the application as early as possible.

This article on ASP.NET Core Web API tutorial Project Configuration is here, for more related ASP.NET Core Web API tutorials, please search the previous articles or continue to browse the following related articles.

{{コード public static void ConfigureCors(this IServiceCollection services) => services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); {{コード コードは以下の通りです。

{{コード
origin 

WithMethods("POST", "GET")

{{コード AllowAnyMethods() メソッドを使用して、サービスを使用するコードを追加します。

{{コード
 WithHeaders("accept", "content-type")
  • {{コード headers {{コード {{コード {{コード
  • {を使用します。 {{コード ASP.NET Core 現在要求されているパスの静的ファイルサービスを有効にします。つまり、現在のディレクトリのファイルに、そのパスを介してアクセスできるようになります。静的ファイルディレクトリへのパスが設定されていない場合、デフォルトで wwwroot ディレクトリが使用されます。
  • {コード self hosted : アプリケーションのリクエストパイプラインにCORSミドルウェアを追加し、クロスドメインリクエストを可能にします。

{{コード 6. Startup クラスの他のコード

public static void ConfigureIISIntegration(this IServiceCollection services) =>
    services.Configure<IISOptions>(options =>
    {

    });

  • {コード Startup : リクエストパイプラインにルーティングミドルウェアを追加します。
  • Extensions , ConfigureService()
    

{{コード 7. 環境に応じた設定

{{コード アプリケーションを開発する際には、開発用( // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // custom extension methods services.ConfigureCors(); services.ConfigureIISIntegration(); services.AddControllers(); } )環境を使用し、アプリケーションをリリースした後は、本番環境( {コード ) 環境を提供します。開発環境と本番環境では、URL、ポート、接続文字列、パスワードなどの機密情報が異なることに対応する。そこで、環境に応じて設定を区別する必要があるのですが、これは.NET Frameworkで簡単に実装することができます。

{{コード {NET Core. プロジェクトを作成すると、プロジェクトのルートに ConfigureServices() というファイルがあり、これがメインの設定ファイルなのですが、このファイルの前にある矢印をクリックすると // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); //custom pipeline start app.UseStaticFiles(); app.UseCors("CorsPolicy"); app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.All All }); //custom pipeline end app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } ファイルを作成します。システムのファイルエクスプローラでプロジェクトディレクトリを開くと、この2つが異なるファイルであることがわかりますが、その中の UseForwardedHeaders() Visual Studio /codeでは、この2つの設定ファイルは一緒に関連付けられています。

header は、特定の環境で使用される設定ファイルであり、その設定ファイルを上書きすることができます。

header 

{{コード HttpContext

{{コード UseStaticFiles() {{コード {{コード {{コード

{{コード UseCors() {{コード {{コード {{コード

ConfigureServices() 

{{コード

{{コード