ASP.NET Core では、ASP.NET 4.x の MVC および Web API アプリ モデルが、ASP.NET Core MVC と呼ばれる単一のプログラミング モデルに結合されます。
この記事では、「ASP.NET Web API 2 の概要」で作成 Products コントローラーを ASP.NET Core に移行する方法について説明します。
Prerequisites
- ASP.NET および Web 開発ワークロードを含む Visual Studio 2022。
- .NET 6 SDK
新しい ASP.NET Core Web API プロジェクトを作成する
- [ ファイル ] メニューの [ 新規>プロジェクト] を選択します。
- 検索ボックスに 「Web API 」と入力します。
- ASP.NET Core Web API テンプレートを選択し、[次へ] を選択します。
- [新しいプロジェクト の構成] ダイアログで、プロジェクトに ProductsCore 名前を付け、[次へ] 選択します。
- [追加情報] ダイアログで、次の 手順 を実行します。
- [フレームワーク] が [.NET 6.0 (長期的なサポート)] になっていることを確認します。
- [コントローラーを使用する] (最小限の API を使用するにはオフにする) チェックボックスにチェックが入っていることを確認します。
- [OpenAPI サポートを有効にする] チェック ボックスをオフにします。
- を選択してを作成します。
WeatherForecast テンプレート ファイルを削除する
- 新しい
WeatherForecast.csプロジェクトからControllers/WeatherForecastController.csと サンプル ファイルを削除します。 - [プロパティ]\launchSettings.jsを開きます。
-
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 モデルをコピーする
- ソリューション エクスプローラー で、プロジェクトを右クリックします。 を選択し、>と新しいフォルダーを追加します。 Models フォルダーに名前を付けます。
- Models フォルダーを右クリックします。 [追加]>[クラス] の順に選択します。 クラス に、Product と名前を付け、を追加するにはを選択します。
- テンプレート モデル コードを次のコードに置き換えます。
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 参照例外から保護します。
この場合の意図は、Name と Category を null 許容型にできることです。
.NET 6 プロジェクトの ASP.NET Core では、既定で null 許容参照型が有効になります。 詳細については、「null 許容参照型」を参照してください。
ProductsController をコピーする
- Controllers フォルダーを右クリックします。
- [追加] > [コントローラー...] を選択します。
- [新規スキャフォールディング アイテムの追加] ダイアログで、[Mvc コントローラー - 空] を選択してから [追加] を選択します。
- コントローラーに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;
}
}
前述の強調表示されたコードでは、ASP.NET Core に移行するために、次の変更が行われます。
ASP.NET Core に存在しない次の ASP.NET 4.x コンポーネントの using ステートメントを削除します。
-
ApiControllerクラス -
System.Web.Http名前空間 -
IHttpActionResultインターフェイス
-
using ProductsApp.Models;ステートメントをusing ProductsCore.Models;に変更します。ルート名前空間を
ProductsCoreに設定します。ApiControllerを ControllerBaseに変更します。using Microsoft.AspNetCore.Mvc;参照を解決するためにControllerBaseを追加します。GetProductアクションの戻り値の型をIHttpActionResultからActionResult<Product>に変更します。 詳細については、「コントローラー アクションの戻り値の型 」を参照してください。GetProductアクションのreturnステートメントを次のステートメントに簡略化します。return product;次のセクションで説明する次の属性を追加します。
[Route("api/[controller]")][ApiController][HttpGet][HttpGet("{id}")]
Routing
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]属性は、属性ルーティングをこのコントローラー内のすべてのアクションの要件にします。がサポートされます。 実行時に、各トークンは、属性が適用されたコントローラーまたはアクションの名前にそれぞれ置き換えられます。 トークン:
- ルートにハード コーディングされた文字列を使用する必要性を軽減または排除します。
- 自動名前変更リファクタリングが適用されるときに、ルートが対応するコントローラーとアクションと同期されたままになります。
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 に移行するために必要な手順について説明します。
サンプル コードを表示またはダウンロードします (ダウンロード方法)。
Prerequisites
- ASP.NET および Web 開発ワークロードを使用する Visual Studio 2019 16.4 以降のバージョン
- .NET Core 3.1 SDK
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 プロジェクトを追加します。
- [ ファイル ] メニューの [ 新規>プロジェクト] を選択します。
- 空白のソリューション テンプレートを選択し、次をクリックします。
- ソリューションに WebAPIMigration 名前を付けます。 を選択してを作成します。
- 既存の ProductsApp プロジェクトをソリューションに追加します。
移行先の新しい API プロジェクトを追加します。
- 新しい ASP.NET Core Web アプリケーション プロジェクトをソリューションに追加します。
- [新しいプロジェクトの構成] ダイアログで、プロジェクトに ProductsCore という名前を付けて、[作成] を選択します。
- [新しい ASP.NET Core Web アプリケーション の作成] ダイアログで、.NET Core と ASP.NET Core 3.1 が選択されていることを確認します。 [API] プロジェクト テンプレートを選択し、 [作成] を選択します。
- 新しい
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 を更新します。
-
Controllers/ProductsController.csと Models フォルダーを元のプロジェクトから新しいプロジェクトにコピーします。 - コピーしたファイルのルート名前空間を
ProductsCoreに変更します。 -
using ProductsApp.Models;ステートメントをusing ProductsCore.Models;に更新します。
ASP.NET Core には、次のコンポーネントは存在しません。
-
ApiControllerクラス -
System.Web.Http名前空間 -
IHttpActionResultインターフェイス
次の変更を行います。
ApiControllerを ControllerBaseに変更します。using Microsoft.AspNetCore.Mvc;参照を解決するためにControllerBaseを追加します。using System.Web.Http;を削除します。GetProductアクションの戻り値の型をIHttpActionResultからActionResult<Product>に変更します。GetProductアクションのreturnステートメントを次のように簡略化します。return product;
ルーティングを構成する
ASP.NET Core API プロジェクト テンプレートには、生成されたコードにエンドポイント ルーティング構成が含まれています。
次の UseRouting と UseEndpoints の呼び出し:
- ミドルウェア パイプラインにルート照合とエンドポイントの実行を登録します。
-
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();
});
}
次のようにルーティングを構成します。
次の属性を使用して、
ProductsControllerクラスをマークします。[Route("api/[controller]")] [ApiController]上記の
[Route]属性は、コントローラーの属性ルーティング パターンを構成します。[ApiController]属性は、属性ルーティングをこのコントローラー内のすべてのアクションの要件にします。属性ルーティングでは、
[controller]や[action]などのトークンがサポートされます。 実行時に、各トークンは、属性が適用されたコントローラーまたはアクションの名前にそれぞれ置き換えられます。 トークン:- プロジェクト内のマジック文字列の数を減らします。
- 自動名前変更リファクタリングが適用されるときに、ルートが対応するコントローラーとアクションと同期されたままになります。
ProductsControllerアクションへの HTTP Get 要求を有効にします。-
[HttpGet]アクションにGetAllProducts属性を適用します。 -
[HttpGet("{id}")]アクションにGetProduct属性を適用します。
-
移行したプロジェクトを実行し、/api/productsを参照します。 3 つの製品の完全な一覧が表示されます。
/api/products/1 にアクセスしてください。 最初の製品が表示されます。
その他のリソース
ASP.NET Core