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 および 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}")]
経路選択
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 および 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