ASP.NET Coreのルーティング設定方法完全ガイド!C#でWebアプリ開発初心者向け
生徒
「C#を使ってWebサイトやWebアプリを作ってみたいのですが、URLと画面がどのように結びついているのか分かりません。」
先生
「Webアプリ開発ではとても大切な視点ですね。C#のASP.NET Coreという仕組みでは、ルーティングという設定を使って、特定のURLにアクセスがあったときにどのプログラムを動かすかを決めているんですよ。」
生徒
「ルーティングという言葉は初めて聞きました。パソコンの操作もあまり得意ではないのですが、そんな私でも設定方法を理解できますか?」
先生
「大丈夫ですよ。道案内や郵便配達のような身近な例えを使いながら、基本的な仕組みから具体的な書き方まで順番に分かりやすく解説していきますね。それでは、ルーティングの基本から一緒に見ていきましょう!」
1. ルーティングとは?
Webアプリ開発の世界におけるルーティングとは、Webブラウザから送られてきたURLという住所をもとに、サーバー側でどのプログラムを実行するかを判断して案内する仕組みのことです。普段私たちがインターネットでホームページを見るときに、画面の上部にあるアドレス欄に入力する文字列がURLです。
プログラミング未経験の方に向けて分かりやすく例えると、ルーティングは「会社の受付係」や「郵便物の仕分け人」のような役割を持っています。例えば、受付に「人事について聞きたいのですが」という人が来たら、受付係は「それなら二階の人事課へ行ってください」と案内します。この「案内する行為」そのものがルーティングです。C#のWebアプリ開発フレームワークであるASP.NET Core(エーエスピーネットコア)でも、このルーティングが非常に重要な役割を担っています。
もしこのルーティングの設定が正しく行われていないと、いくら素晴らしいデザインの画面や便利な計算プログラムを作っても、Webブラウザに表示することができなくなってしまいます。URLとプログラムを結ぶ架け橋として、まずはこの概念をしっかりと頭に入れておきましょう。
2. Webアプリが動く仕組みとURLの基本
ルーティングの具体的な設定方法を学ぶ前に、パソコンのブラウザでWebページが表示されるときの基本的な流れをおさらいしておきましょう。普段私たちがスマートフォンやパソコンでボタンをクリックしたとき、裏側では次のようなやり取りが行われています。
まず、あなたのパソコン(クライアント)から、Webページを管理しているコンピューター(サーバー)に対して、「このページを見せてください」というお願いを送信します。このお願いのことを専門用語でリクエストと呼びます。そして、そのリクエストを受け取ったサーバーが「はい、どうぞ」と画面のデータを返してくれます。この返事のことをレスポンスと呼びます。
このとき、サーバーに対して「どのページが欲しいのか」を伝えるために使うのがURLです。URLはいくつかのパーツに分かれており、どこのサーバーにある、どの機能を呼び出したいのかが細かく指定されています。ASP.NET Coreのルーティングは、このURLの文字列を先頭から細かく分析して、呼び出すべきC#のプログラムを見つけ出す処理を行っているのです。この仕組みがあるおかげで、私たちは一つのWebアプリの中で、トップページ、お問い合わせページ、商品一覧ページといった複数の画面を切り替えて表示することができます。
3. 属性ルーティングの基本と設定方法
ASP.NET Coreでルーティングを設定する方法にはいくつか種類がありますが、現在最もよく使われていて初心者にも分かりやすいのが属性ルーティングという方法です。これは、実行したいC#のプログラムのすぐ上に、直接URLの形を書き込んで指定する手法です。
C#のWebアプリ開発では、画面を表示するための処理をまとめたクラスをコントローラー、その中にある個々の処理を行う関数をアクションメソッドと呼びます。属性ルーティングでは、このアクションメソッドに対して、「Route」という特別な印をつけることで、URLを割り当てます。実際のプログラムコードを見てみましょう。
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
[Route("welcome")]
public string WelcomeMessage()
{
return "ウェブアプリ開発の世界へようこそ!";
}
}
このコードでは、関数の上に「[Route("welcome")]」という記述があります。これが属性ルーティングの設定です。これにより、Webブラウザで「サーバーの住所/welcome」というURLにアクセスがあったとき、この関数が自動的に実行されるようになります。そして、画面には指定した文字が出力されます。実行結果は次のようになります。
ウェブアプリ開発の世界へようこそ!
プログラムのすぐ上にURLを直接書くだけなので、どのURLでどの処理が動くのかが一目で分かり、初心者にとっても管理しやすいのが大きなメリットです。
4. ルーティングでURLから値を受け取る方法
Webアプリを作っていると、URLの中に含まれる特定の数字や文字をプログラムの中で使いたい場面がよく出てきます。例えば、ネットショップの商品ページで、商品番号ごとに異なる画面を表示したい場合などです。このようなとき、ルーティングの設定を使ってURLの一部をパラメータ(引数)として受け取ることができます。
パラメータを受け取るためには、ルート設定の文字列の中に波括弧を使って「{変数名}」という形式で記述します。そして、関数の側でも同じ名前の変数を用意しておきます。具体的な書き方を確認してみましょう。
using Microsoft.AspNetCore.Mvc;
public class ProductController : Controller
{
[Route("item/{id}")]
public string ShowProduct(int id)
{
return "表示している商品の識別番号は " + id + " です。";
}
}
このプログラムでは、URLの設定を「"item/{id}"」としています。この波括弧で囲まれた部分は、アクセスするたびに自由に変えることができる場所になります。例えば、Webブラウザで「サーバーの住所/item/105」と入力してアクセスすると、波括弧の部分にある「105」という数値が、自動的に関数の変数である「id」へと届けられます。このプログラムを実行したときの画面表示は次のようになります。
表示している商品の識別番号は 105 です。
このように、URLの形を工夫することで、一つのプログラムでありながら、ユーザーの要求に合わせて動的に内容を変化させることができるようになります。これがWebアプリ開発におけるルーティングの強力な機能の一つです。
5. コントローラー全体に共通のルートを設定する
Webアプリの規模が大きくなってくると、同じようなURLの始まりを持つページがたくさん増えてきます。例えば、管理者用のページであれば、すべて「admin/」から始まるURLに統一したいといった要望です。このような場合、個々の関数すべてに「admin/」と書き続けるのは大変ですし、書き間違えの原因にもなります。
そこで、クラス全体の共通ルールとしてURLの始まりを固定する方法があります。クラス定義のすぐ上にルート設定を書くことで、そのクラスの中にあるすべての関数に対して、共通のURLプレフィックス(接頭辞)を自動的に付与することができます。実際の書き方を見てみましょう。
using Microsoft.AspNetCore.Mvc;
[Route("shop")]
public class StoreController : Controller
{
[Route("info")]
public string ShopInformation()
{
return "こちらは店舗の基本情報ページです。";
}
[Route("location")]
public string ShopLocation()
{
return "こちらは店舗のアクセス地図ページです。";
}
}
このコードでは、クラスの頭に「[Route("shop")]」と書いてあります。これにより、この中にある関数にアクセスするためのURLは、必ず「shop/」から始まるルールになります。したがって、一つ目の関数を呼び出すためのURLは「shop/info」となり、二つ目の関数を呼び出すためのURLは「shop/location」となります。一つ目のURLにアクセスした際の出力結果は以下の通りです。
こちらは店舗の基本情報ページです。
このように設定を共通化することで、コードの量を減らし、URLの構成を綺麗に整理することができるようになります。
6. 従来の定型ルーティングの設定方法
ここまで紹介した属性ルーティングとは別に、ASP.NET Coreには従来の定型ルーティング(コンベンショナルルーティング)と呼ばれる設定方法もあります。これは、プログラム全体に適用される共通のURLパターンを、アプリの起動時に一括して登録しておく方法です。
この設定は、プロジェクトの初期設定を行う「Program.cs」というファイルの中に記述します。標準的なパターンとして、「コントローラー名 / アクション名 / 識別番号」という形式を登録することが多いです。実際の起動設定ファイルの記述例を確認してみましょう。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
このコードの中にある「pattern:」の部分が、URLの規則を表しています。イコールで書かれている部分は、もしURLで省略された場合に自動的に使われるデフォルトの値です。また、「id?」のようにクエスチョンマークがついている部分は、あってもなくてもどちらでも良いという意味になります。
この設定が生きていると、例えば「Customer/Detail」というURLでアクセスがあった場合、自動的に「CustomerController」というクラスの中にある「Detail」という名前の関数を探して実行してくれます。個々のプログラムにルートを書かなくても、名前のルールに従って自動で紐づけが行われるのが特徴です。アプリの規模や開発チームの方針に合わせて、属性ルーティングと使い分けることが一般的です。
7. 複数のURLを一つのプログラムに割り当てる方法
Webアプリを運用していると、過去のURLを変更したけれど、古いURLでアクセスしてきたユーザーも同じように新しいページに案内したい、あるいは表記の揺れに対応したいといった場面に遭遇することがあります。ASP.NET Coreの属性ルーティングでは、一つの関数に対して複数のルート設定を重ねて記述することが可能です。
書き方は非常にシンプルで、設定したいURLの数だけ、関数の上に「Route」の記述を並べるだけです。実際に複数のURLを受け付けるプログラムの例を見てみましょう。
using Microsoft.AspNetCore.Mvc;
public class SupportController : Controller
{
[Route("help")]
[Route("support")]
[Route("contact")]
public string ContactPage()
{
return "お問い合わせ窓口のページです。";
}
}
このプログラムでは、関数の上に三つの異なるルートが指定されています。これによって、ユーザーが「help」にアクセスしても、「support」にアクセスしても、あるいは「contact」にアクセスしても、すべて同じこの関数が呼び出されるようになります。どのURLからアクセスしても、実行結果は以下のように同一の画面が表示されます。
お問い合わせ窓口のページです。
ユーザーの利便性を高めるために、柔軟なURL設計を行いたいときに非常に役立つテクニックです。基本をマスターしたら、このような応用的な設定も取り入れて、より使いやすいWebアプリケーションの開発を目指してみてください。