次の方法で共有


ASP.NET Web API から ASP.NET Core への移行

ASP.NET Core では、ASP.NET 4.x の MVC および Web API アプリ モデルが、ASP.NET Core MVC と呼ばれる単一のプログラミング モデルに結合されます。

この記事では、「ASP.NET Web API 2 の概要」で作成 Products コントローラーを ASP.NET Core に移行する方法について説明します。

[前提条件]

新しい ASP.NET Core Web API プロジェクトを作成する

  1. [ ファイル ] メニューの [ 新規>プロジェクト] を選択します。
  2. 検索ボックスに 「Web API 」と入力します。
  3. ASP.NET Core Web API テンプレートを選択し、[次へ] を選択します。
  4. [新しいプロジェクト の構成] ダイアログで、プロジェクトに ProductsCore 名前を付け、[次へ] 選択します。
  5. [追加情報] ダイアログで、次の 手順 を実行します。
    1. [フレームワーク][.NET 6.0 (長期的なサポート)] になっていることを確認します。
    2. [コントローラーを使用する( 最小限の API を使用する場合はオフ)] チェックボックスがオンになっていることを確認します。
    3. [OpenAPI サポートを有効にする] チェック ボックスをオフにします。
    4. を選択してを作成します。

WeatherForecast テンプレート ファイルを削除する

  1. 新しい WeatherForecast.cs プロジェクトから Controllers/WeatherForecastController.cs サンプル ファイルを削除します。
  2. プロパティ\launchSettings.jsを開きます。
  3. launchUrl プロパティを weatherforcast から productscoreに変更します。

ASP.NET Core Web API の構成

ASP.NET Core では、App_Start フォルダーまたは Global.asax ファイルは使用されません。 web.config ファイルは発行時に追加されます。 詳細については、web.config ファイルを参照してください。

Program.cs ファイル:

  • Global.asax を置き換えます。
  • すべてのアプリのスタートアップ タスクを処理します。

詳細については、「ASP.NET Core でのアプリの起動」を参照してください。

ASP.NET Core Program.cs ファイルのアプリケーション スタートアップ コードを次に示します。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

var app = builder.Build();

// Configure the HTTP request pipeline.

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Product モデルをコピーする

  1. ソリューション エクスプローラー で、プロジェクトを右クリックします。 を選択し、>と新しいフォルダーを追加します。 Models フォルダーに名前を付けます。
  2. Models フォルダーを右クリックします。 [追加]>[クラス] の順に選択します。 クラス に、Product と名前を付け、を追加するにはを選択します。
  3. テンプレート モデル コードを次のコードに置き換えます。
namespace ProductsCore.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string? Name { get; set; }
        public string? Category { get; set; }
        public decimal Price { get; set; }
    }
}

上記の強調表示されたコードでは、次の変更が行われます。

  • ? 注釈が追加され、Name プロパティと Category プロパティが null 許容参照型として宣言されました。

C# 8 で導入されたNull 許容機能を利用することで、ASP.NET Core は参照型の処理において追加のコード フロー分析とコンパイル時の安全性を提供できます。 たとえば、null 参照例外から保護します。

この場合の意図は、NameCategory を null 許容型にできることです。

.NET 6 プロジェクトの ASP.NET Core では、既定で null 許容参照型が有効になります。 詳細については、「null 許容参照型」を参照してください。

ProductsController をコピーする

  1. Controllers フォルダーを右クリックします。
  2. [追加] > [コントローラー...] を選択します。
  3. [新規スキャフォールディング アイテムの追加] ダイアログで、[Mvc コントローラー - 空] を選択してから [追加] を選択します。
  4. コントローラーにProductsController と名前を付け、追加を選択します。
  5. テンプレート コントローラーのコードを次のコードに置き換えます。
using Microsoft.AspNetCore.Mvc;
using ProductsCore.Models;

namespace ProductsCore.Controllers;

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
    Product[] products = new Product[]
    {
            new Product
            {
                Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
            },
            new Product
            {
                Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
            },
            new Product
            {
                Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
            }
    };

    [HttpGet]
    public IEnumerable<Product> GetAllProducts()
    {
        return products;
    }

    [HttpGet("{id}")]
    public ActionResult<Product> GetProduct(int id)
    {
        var product = products.FirstOrDefault((p) => p.Id == id);
        if (product == null)
        {
            return NotFound();
        }
        return product;
    }
}

前述の強調表示されたコードでは、ASP.NET Core に移行するために、次の変更が行われます。

  • ASP.NET Core に存在しない次の ASP.NET 4.x コンポーネントの using ステートメントを削除します。

    • ApiController クラス
    • System.Web.Http 名前空間
    • IHttpActionResult インターフェイス
  • using ProductsApp.Models; ステートメントを using ProductsCore.Models;に変更します。

  • ルート名前空間を ProductsCoreに設定します。

  • ApiControllerControllerBaseに変更します。

  • using Microsoft.AspNetCore.Mvc; 参照を解決するために ControllerBase を追加します。

  • GetProduct アクションの戻り値の型を IHttpActionResult から ActionResult<Product>に変更します。 詳細については、「コントローラー アクションの戻り値の型 」を参照してください。

  • GetProduct アクションの return ステートメントを次のステートメントに簡略化します。

    return product;
    
  • 次のセクションで説明する次の属性を追加します。

    • [Route("api/[controller]")]
    • [ApiController]
    • [HttpGet]
    • [HttpGet("{id}")]

経路選択

ASP.NET Core では、エンドポイント ルーティング ミドルウェアがミドルウェア パイプライン全体をラップする最小限のホスティング モデルが提供されるため、ルートを登録するために明示的に WebApplication または UseEndpoints を呼び出すことなく、ルートを UseRouting に直接追加できます。

UseRouting は引き続きルートの照合を行う場所を指定するために使用できますが、ミドルウェア パイプラインの先頭でルートを照合する必要がある場合は、UseRouting を明示的に呼び出す必要はありません。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

var app = builder.Build();

// Configure the HTTP request pipeline.

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

WebApplication ルートは、パイプラインの エンド で実行されます。

移行された ProductsController でのルーティング

移行された ProductsController には、次の強調表示された属性が含まれています。

using Microsoft.AspNetCore.Mvc;
using ProductsCore.Models;

namespace ProductsCore.Controllers;

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
    Product[] products = new Product[]
    {
            new Product
            {
                Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
            },
            new Product
            {
                Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
            },
            new Product
            {
                Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
            }
    };

    [HttpGet]
    public IEnumerable<Product> GetAllProducts()
    {
        return products;
    }

    [HttpGet("{id}")]
    public ActionResult<Product> GetProduct(int id)
    {
        var product = products.FirstOrDefault((p) => p.Id == id);
        if (product == null)
        {
            return NotFound();
        }
        return product;
    }
}
  • [Route] 属性 は、コントローラーの属性ルーティング パターンを構成します。

  • [ApiController] 属性は、属性ルーティングをこのコントローラー内のすべてのアクションの要件にします。

  • [action]がサポートされます。 実行時に、各トークンは、属性が適用されたコントローラーまたはアクションの名前にそれぞれ置き換えられます。 トークン:

    • ルートにハード コーディングされた文字列を使用する必要性を軽減または排除します。
    • 自動名前変更リファクタリングが適用されるときに、ルートが対応するコントローラーとアクションと同期されたままになります。
  • HTTP Get 要求は、次の属性を持つ ProductController アクションに対して有効になります。

    • [HttpGet] 属性は、GetAllProducts アクションに適用されます。
    • [HttpGet("{id}")] 属性は、GetProduct アクションに適用されます。

移行したプロジェクトを実行し、/api/productsを参照します。 たとえば、/api/products を https://localhost:<port>します。 3 つの製品の完全な一覧が表示されます。 /api/products/1 にアクセスしてください。 最初の製品が表示されます。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

その他のリソース

この記事では、ASP.NET 4.x Web API から ASP.NET Core MVC に移行するために必要な手順について説明します。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

[前提条件]

ASP.NET 4.x Web API プロジェクトをレビューする

この記事では、「ASP.NET Web API 2 の概要」で作成した ProductsApp プロジェクトを使用します。 このプロジェクトでは、基本的な ASP.NET 4.x Web API プロジェクトを次のように構成します。

Global.asax.csでは、WebApiConfig.Registerへの呼び出しが行われます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;

namespace ProductsApp
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }
}

WebApiConfig クラスは App_Start フォルダーにあり、静的な Register メソッドがあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace ProductsApp
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

前のクラス:

  • 属性ルーティング を構成しますが、実際には使用されていません。
  • ルーティング テーブルを構成します。 サンプル コードでは、URL が /api/{controller}/{id}形式と一致することを想定しています。{id} は省略可能です。

次のセクションでは、Web API プロジェクトを ASP.NET Core MVC に移行する方法について説明します。

宛先プロジェクトを作成する

Visual Studio で新しい空のソリューションを作成し、移行する ASP.NET 4.x Web API プロジェクトを追加します。

  1. [ ファイル ] メニューの [ 新規>プロジェクト] を選択します。
  2. 空白のソリューション テンプレートを選択し、をクリックします。
  3. ソリューションに WebAPIMigration 名前を付けます。 を選択してを作成します。
  4. 既存の ProductsApp プロジェクトをソリューションに追加します。

移行先の新しい API プロジェクトを追加します。

  1. 新しい ASP.NET Core Web アプリケーション プロジェクトをソリューションに追加します。
  2. [新しいプロジェクトの構成] ダイアログで、プロジェクトに ProductsCore という名前を付けて、[作成] を選択します。
  3. [新しい ASP.NET Core Web アプリケーション の作成] ダイアログで、.NET CoreASP.NET Core 3.1 が選択されていることを確認します。 [API] プロジェクト テンプレートを選択し、 [作成] を選択します。
  4. 新しい WeatherForecast.cs プロジェクトから Controllers/WeatherForecastController.cs サンプル ファイルを削除します。

ソリューションに 2 つのプロジェクトが含まれるようになりました。 以降のセクションでは、ProductsApp プロジェクトの内容を ProductsCore プロジェクトに移行する方法について説明します。

構成を移行する

ASP.NET Core では、App_Start フォルダーまたは Global.asax ファイルは使用されません。 さらに、web.config ファイルは発行時に追加されます。

Startup クラス:

  • Global.asax を置き換えます。
  • すべてのアプリのスタートアップ タスクを処理します。

詳細については、「ASP.NET Core でのアプリの起動」を参照してください。

モデルとコントローラーを移行する

次のコードは、ASP.NET Core 用に更新される ProductsController を示しています。

using ProductsApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;

namespace ProductsApp.Controllers
{
    public class ProductsController : ApiController
    {
        Product[] products = new Product[] 
        { 
            new Product
            {
                Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
            }, 
            new Product
            {
                Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
            }, 
            new Product
            {
                Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
            } 
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public IHttpActionResult GetProduct(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                return NotFound();
            }
            return Ok(product);
        }
    }
}

ASP.NET Core の ProductsController を更新します。

  1. Controllers/ProductsController.csModels フォルダーを元のプロジェクトから新しいプロジェクトにコピーします。
  2. コピーしたファイルのルート名前空間を ProductsCoreに変更します。
  3. using ProductsApp.Models; ステートメントを using ProductsCore.Models;に更新します。

ASP.NET Core には、次のコンポーネントは存在しません。

  • ApiController クラス
  • System.Web.Http 名前空間
  • IHttpActionResult インターフェイス

次の変更を行います。

  1. ApiControllerControllerBaseに変更します。 using Microsoft.AspNetCore.Mvc; 参照を解決するために ControllerBase を追加します。

  2. using System.Web.Http;を削除します。

  3. GetProduct アクションの戻り値の型を IHttpActionResult から ActionResult<Product>に変更します。

  4. GetProduct アクションの return ステートメントを次のように簡略化します。

    return product;
    

ルーティングを構成する

ASP.NET Core API プロジェクト テンプレートには、生成されたコードにエンドポイント ルーティング構成が含まれています。

次の UseRoutingUseEndpoints の呼び出し:

  • ミドルウェア パイプラインにルート照合とエンドポイントの実行を登録します。
  • ProductsApp プロジェクトの App_Start/WebApiConfig.cs ファイルを置き換えます。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

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

次のようにルーティングを構成します。

  1. 次の属性を使用して、ProductsController クラスをマークします。

    [Route("api/[controller]")]
    [ApiController]
    

    上記の [Route] 属性は、コントローラーの属性ルーティング パターンを構成します。 [ApiController] 属性は、属性ルーティングをこのコントローラー内のすべてのアクションの要件にします。

    属性ルーティングでは、[controller][action]などのトークンがサポートされます。 実行時に、各トークンは、属性が適用されたコントローラーまたはアクションの名前にそれぞれ置き換えられます。 トークン:

    • プロジェクト内のマジック文字列の数を減らします。
    • 自動名前変更リファクタリングが適用されるときに、ルートが対応するコントローラーとアクションと同期されたままになります。
  2. ProductsController アクションへの HTTP Get 要求を有効にします。

    • [HttpGet] アクションに GetAllProducts 属性を適用します。
    • [HttpGet("{id}")] アクションに GetProduct 属性を適用します。

移行したプロジェクトを実行し、/api/productsを参照します。 3 つの製品の完全な一覧が表示されます。 /api/products/1 にアクセスしてください。 最初の製品が表示されます。

その他のリソース