「ビルドは通るのにブラウザーに出てくるのは “ASP.NET のようこそ” ページだけ…」という相談は、オンプレミスの古い Web API から ASP.NET Core まで、バージョンを問わずとてもよくあります。この現象は致命的なバグではなく、たいていは「プロジェクトの種類」「ルート設定」「起動 URL」のどこかが期待とずれているだけです。この記事では、代表的な原因パターンと、現場でそのまま使える切り分け手順・設定例をまとめて解説します。
症状の整理:ビルド成功なのに既定の ASP.NET ページしか表示されない
まずは、今回の症状をもう少し具体的に整理しておきます。
- Visual Studio でソリューションを開き、ビルド・実行(F5)するとエラーは出ない
- ブラウザーは自動で立ち上がるが、表示されるのは
- 「ASP.NET へようこそ」的な既定ページ
- または真っ白に近いプレースホルダー画面
- 本来期待している「自分たちのアプリの画面」が出てこない
このとき、多くの場合はアプリ自体が落ちているわけではなく、「/(ルート)」にアクセスした結果として出てくる画面がたまたま既定ページになっているだけです。
よくある構成パターンと挙動
まず、プロジェクトの種類と「ルート URL(/)」にアクセスしたときの標準挙動を対応づけてイメージしておくと切り分けが早くなります。
| プロジェクト種類 | 想定される構成 | ルート “/” の標準挙動 | 今回の症状との関係 |
|---|---|---|---|
| ASP.NET Web API (.NET Framework) | Views なし、Web API コントローラーのみ | UI なし。テンプレートのプレースホルダーページ or 空に近い画面 | 「画面が出ない」という相談の約半分はこれ |
| ASP.NET Core Web API | Controllers のみ。wwwroot も空が多い | Swagger を設定していなければ何も出ない or 既定ページ | 「/swagger」に行けば API Docs が出ることも多い |
| ASP.NET MVC / Razor Pages | Views や Pages フォルダーあり | Home/Index や Index.cshtml が出るのが一般的 | ルート設定や既定ドキュメントのずれで症状が出やすい |
| SPA(React / Angular 等ホスト) | wwwroot 内の index.html を返す構成 | UseDefaultFiles / UseStaticFiles の設定次第 | ミドルウェアの順番・有無が原因になることが多い |
次からは、「なぜそのような挙動になるのか」を原因パターン別に見ていきます。
原因の典型パターンと見分け方
API プロジェクトなのに UI を期待している
もっとも多いのが、「Web API テンプレートで作られたプロジェクトに対して、画面が出てくることを期待している」パターンです。
- ソリューションを開くと
- Views フォルダーが存在しない
- Pages フォルダーもない
- wwwroot フォルダーも空(もしくは存在しない)
- Controllers フォルダーにあるのは API コントローラーのみ(クラス名が XxxController で、戻り値が IActionResult や DTO)
この場合、そもそも UI を返す仕組みがプロジェクトの中にありません。ルート “/” へのアクセスで何か画面が出るとしたら、それはテンプレートが用意したダミーのページか、IIS の既定ページです。
見分けるポイントは次の通りです。
- 「Views」「Pages」「wwwroot」が存在しない → ほぼ API 専用プロジェクト
- Program.cs / Startup.cs を開くと
- app.MapControllers(); だけがあり、Razor や MVC 関連の設定がない
この構成で UI が欲しい場合は、後述の「Swagger を出す」「静的な index.html を置く」「別プロジェクトとしてフロントエンドを用意する」といった設計が必要です。
スタートページ/ルート設定の不一致
次に多いのが、「ルート “/” にアクセスしたときに何が表示されるか」が、プロジェクト作成時のテンプレートのままになっているパターンです。
ASP.NET / ASP.NET Core では、ルート “/” にアクセスしたときに表示されるものは、次のどれかです。
- 静的ファイル: wwwroot/index.html, default.html など
- MVC のアクション: HomeController の Index アクションなど
- Razor Pages: /Pages/Index.cshtml など
- 特定のエンドポイントにリダイレクトさせるハンドラー
一方で、アプリ側の「本来のトップページ」は、たとえば次のようなパスになっていることが多いです。
- /Home/Index
- /Account/Login
- /portal/index.html
- /swagger
Visual Studio のデバッグ設定(launchSettings.json)で launchUrl が「/」のままになっていると、ブラウザーは毎回ルートにアクセスします。その結果、テンプレートが用意していた既定ページが表示され続けることになります。
静的ファイル/既定ドキュメントの設定不足
UI を静的ファイル(html, js, css)で作っている場合、サーバー側にそれらを返すための設定が抜けていると、「あるはずの index.html が出てこない」状態になります。
ASP.NET Core の例
Program.cs(もしくは Startup.cs)のパイプラインで、次のような設定をしていないと、wwwroot/index.html は自動では返されません。
// Program.cs (.NET 6 以降の例)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(); // API のみでも OK
var app = builder.Build();
// これがないと index.html などは返ってこない
app.UseDefaultFiles(); // index.html, default.html を既定ドキュメント扱いにする
app.UseStaticFiles(); // wwwroot 以下のコンテンツを配信
app.MapControllers();
app.Run();
これらが抜けていると、サーバー側は「/ に対して返すべきファイルがない」と判断し、IIS や ASP.NET Core の既定ページが表示されることがあります。
.NET Framework + IIS の例
.NET Framework 時代(System.Web)では、IIS の 既定ドキュメント(defaultDocument)設定によってルートアクセス時の挙動が決まります。web.config に次のような設定があるかを確認します。
<system.webServer>
<defaultDocument enabled="true">
<files>
<clear />
<add value="index.html" />
<add value="default.html" />
<add value="Default.aspx" />
</files>
</defaultDocument>
</system.webServer>
ここに本来表示したいファイル名が含まれていない場合、IIS のサイト設定や別の既定ページに処理が流れ、結果としてテンプレートの「ようこそ」画面が出続けることがあります。
Swagger(OpenAPI)UI が環境依存になっている
ASP.NET Core Web API のテンプレートでは、開発環境(Development)でのみ Swagger を有効化するコードが最初から入っています。
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
このまま本番用ビルドや別の環境で実行すると、/swagger にアクセスしても Swagger UI が表示されず、ルート “/” にも何も設定されていないため、既定ページが出るだけになってしまいます。
「開発機では Swagger が出ていたのに、本番サーバーにデプロイすると既定の ASP.NET ページしか出ない」というときは、まずこの条件分岐を疑ってください。
起動プロジェクト/起動 URL の選択ミス
ソリューション内に複数の Web プロジェクトがある場合、次のようなミスも起こりがちです。
- 古いテスト用 Web プロジェクトが「スタートアッププロジェクト」に設定されている
- そのテストプロジェクトの画面が「ASP.NET へようこそ」で止まっている
- 肝心の新しいプロジェクトはビルド対象だが、実際には起動されていない
また、起動プロジェクトは正しくても、起動 URL がテンプレートのままになっていることもあります。
- launchSettings.json の
launchUrlが""(ルート)や"weatherforecast"のまま - Visual Studio の「プロパティ > デバッグ」で「特定のページ」が空欄
これらはアプリのコードに不具合があるわけではないので、設定さえ修正すればすぐに解消できます。
原因パターンの早見表
| パターン | 典型的な症状 | 確認ポイント | 代表的な対処 |
|---|---|---|---|
| API 専用プロジェクト | Views も wwwroot もなく UI が出ない | フォルダー構成、Program.cs / Startup.cs | Swagger を出す / index.html を追加 |
| ルート設定の不一致 | / ではテンプレートページ、本来の画面は別 URL | ルーティング設定、Home/Index などの URL | 既定ルートの変更、リダイレクト設定 |
| 静的ファイル設定不足 | wwwroot にファイルはあるのに表示されない | UseStaticFiles / UseDefaultFiles の有無 | ミドルウェア追加、defaultDocument の設定 |
| Swagger 環境依存 | 開発では見えるが本番で /swagger が 404 | IsDevelopment() 条件、環境変数 ASPNETCORE_ENVIRONMENT | 本番でも Swagger を出す or 別 UI を用意 |
| 起動設定ミス | 間違ったプロジェクトや URL を起動している | スタートアッププロジェクト、launchSettings.json | 起動プロジェクトと起動 URL の修正 |
すばやく切り分けるためのチェックリスト
現場で最短で原因に辿り着くために、次の順番でチェックしてみてください。
- プロジェクトの種類を確認
- Views / Pages / wwwroot があるか
- Controllers の中身が API 用なのか、MVC 用なのか
- 起動 URL を確認
- launchSettings.json の
launchUrl - Visual Studio の「プロジェクトのプロパティ > デバッグ」
- launchSettings.json の
- ASP.NET Core なら Program.cs / Startup.cs で
UseStaticFiles()とUseDefaultFiles()の有無- ルーティング(MapControllerRoute / MapControllers)の設定
- Swagger を使っている場合
UseSwagger(),UseSwaggerUI()が環境条件付きになっていないか- 実際に
/swaggerにアクセスするとどうなるか
- .NET Framework / IIS の場合
- web.config の
defaultDocument設定 - IIS マネージャーでの既定ドキュメント設定
- web.config の
- 複数プロジェクトがあるなら
- スタートアッププロジェクトが正しいか
- 不要な古いプロジェクトを誤って F5 起動していないか
API 専用プロジェクトの場合の具体的な対処法
既存のオンプレミス Web API や、ASP.NET Core Web API テンプレートで作られたプロジェクトなど、UI を持たない構成のときに「画面を見せたい」となった場合の現実的な選択肢を紹介します。
Swagger UI を常時表示する
もっとも簡単に「それっぽい画面」を用意できるのが、Swagger UI を常時出す構成です。API 仕様の確認にも使えるので、一石二鳥です。
ASP.NET Core 6+ の Program.cs 例
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// 環境にかかわらず Swagger を出す場合
app.UseSwagger();
app.UseSwaggerUI();
// 静的ファイルも後で使うならここに追加しておく
// app.UseDefaultFiles();
// app.UseStaticFiles();
app.MapControllers();
app.Run();
もともとテンプレートでは if (app.Environment.IsDevelopment()) の中に Swagger が入っているため、本番では無効化されていることが多いです。開発・検証環境では上記のように条件を外してしまうのが手っ取り早いです。
launchSettings.json で起動 URL を /swagger に変更する
Swagger を出しただけでは、ブラウザーが http://localhost:xxxx/ にアクセスしてしまうと既定ページが表示されます。そこで、起動 URL を /swagger に変更します。
{
"profiles": {
"YourProject": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Visual Studio から F5 すると、最初から Swagger UI が表示されるようになります。「画面が出ない」問題で悩んでいるチームでは、まずここまでやってしまうと開発効率がかなり上がります。
案内用の index.html を用意する
API としてのエンドポイントだけでなく、簡単な案内ページを出したい場合は、wwwroot に index.html を置いて案内ページにしてしまうのが実務的です。
Program.cs の設定
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
// index.html を既定ドキュメントにする
app.UseDefaultFiles(); // index.html / default.html などを優先
app.UseStaticFiles(); // wwwroot 以下を配信
app.MapControllers();
app.Run();
wwwroot/index.html の例
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>社内 Web API ポータル</title>
</head>
<body>
<h1>社内 Web API ポータル</h1>
<p>このサーバーでは以下の API を提供しています。</p>
<ul>
<li><a href="/swagger">Swagger UI(API 一覧)</a></li>
<li><a href="/health">Health Check</a></li>
</ul>
</body>
</html>
これでルート “/” にアクセスすると、社内向けの案内ページが表示されるようになります。Swagger と組み合わせれば、「画面が出ない」悩みから一気に解放されます。
MVC / Razor / SPA など UI ありプロジェクトの対処法
もともと UI があるプロジェクトなのに既定ページしか出ない場合は、ルート設定・既定ドキュメント・起動 URL のどれかが噛み合っていないケースがほとんどです。
MVC の既定ルートを確認・修正する(ASP.NET Core)
ASP.NET Core MVC の場合、Program.cs でルーティングを次のように設定しているはずです。
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
このパターンは「/ にアクセスしたとき HomeController の Index アクションを呼ぶ」という意味です。もし、アプリのトップページとして使いたいコントローラー/アクションが別の場合は、ここを変更します。
// 例: PortalController の Dashboard アクションをトップにしたい
app.MapControllerRoute(
name: "default",
pattern: "{controller=Portal}/{action=Dashboard}/{id?}");
変更後は、/Portal/Dashboard だけでなく、ルート “/” でも同じ画面が表示されるようになります。
ルート “/” を明示的にリダイレクトする
既定ルートをいじりたくない場合は、ルート “/” にアクセスされたら特定の URL にリダイレクトするという書き方もよく使われます。
// .NET 6 以降の Minimal Hosting スタイルの例
app.MapGet("/", () => Results.Redirect("/portal/dashboard"));
または、エリアや認証の関係でトップを /Account/Login にしたい場合も同様です。
app.MapGet("/", () => Results.Redirect("/Account/Login"));
このように「/ に来たらどこに飛ばすのか」を明示しておくと、テンプレートの既定ページが出てきてしまう余地がかなり減ります。
ASP.NET Core での静的ファイル + MVC の組み合わせ
UI を SPA + API の構成にしている場合、静的ファイルと MVC の両方を扱う順番も意識する必要があります。
app.UseStaticFiles(); // 先に静的ファイルを有効化する
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// API / MVC ルート
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
一般的には、SPA(wwwroot/index.html)を優先して返したい場合は UseStaticFiles() と UseDefaultFiles() をルーティングより前に置き、API や MVC のルートはその後に続けます。順番が逆になっていると、「本来返したい index.html よりも先にテンプレートのルートがヒットする」ことがあります。
Visual Studio の起動 URL を合わせる
コード側のルーティングが正しくても、Visual Studio が毎回「別の URL」を開いてしまうと、いつまでたっても目的の画面にたどり着けません。
| 確認場所 | 設定項目 | ポイント |
|---|---|---|
| launchSettings.json | profiles.[プロファイル名].launchUrl | 空文字 or / のときはルート。必要に応じて home/index や portal/dashboard に変更 |
| プロジェクトのプロパティ > デバッグ | 起動ブラウザー URL / 特定のページ | 「特定のページ」を選び、/Home/Index などを指定 |
| ソリューションのスタートアッププロジェクト | 右クリック > スタートアッププロジェクトに設定 | 複数 Web プロジェクトがある場合は要確認 |
特に、古いサンプルプロジェクトやテンプレートをベースに改造している場合、launchSettings.json が昔の URL のまま残っていることが多いので注意してください。
IIS / IIS Express / .NET Framework 固有のポイント
オンプレミスの既存 Web API やレガシーな ASP.NET Web フォーム/MVC の場合、IIS 側の設定が原因で既定の ASP.NET ページが出ているケースもよくあります。
web.config の defaultDocument を確認する
既存アプリが IIS 上で動いている場合、web.config の defaultDocument セクションがルート “/” の挙動を決めています。
<system.webServer>
<defaultDocument enabled="true">
<files>
<clear />
<add value="index.html" />
<add value="default.html" />
<add value="Default.aspx" />
</files>
</defaultDocument>
</system.webServer>
ここに本来表示したいファイル(たとえば Portal.aspx)が含まれていない場合、IIS の既定の順番で他のファイルが返され、結果としてテンプレートのようこそ画面が表示される、というパターンがあります。
MVC (.NET Framework) の RouteConfig を確認する
ASP.NET MVC (.NET Framework) では、App_Start/RouteConfig.cs によって既定ルートが定義されています。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
ここで controller = "Home", action = "Index" としているのに、HomeController の Index アクションが削除されている、または別のコントローラーをトップにしたいのに defaults を変えていない、といったミスマッチがあると、IIS 側に処理が落ちて既定ページが出てしまうことがあります。
仮想ディレクトリ・アプリケーションの階層構成に注意
オンプレミスの IIS では、同じサイトの下に複数のアプリケーションや仮想ディレクトリをぶら下げていることがよくあります。
- ルートサイトの既定ページ(Default.aspx)が ASP.NET のようこそ画面
- その下に「/App」というアプリケーションを作り、本来のアプリを配置
- しかしブラウザーで「http://サーバー名/」にアクセスしてしまう
この場合、アクセスしているのは「/App」ではなくルートサイトなので、いつまでたっても既定ページしか表示されません。URL が本当にアプリケーションのルート(/App など)を指しているかを必ず確認してください。
実際のトラブルシューティング手順例
ここまでの内容を踏まえて、実際に現場でよくあるケースを想定した「診断フロー」の例を示します。
ケース 1:ASP.NET Core Web API を F5 すると既定ページだけが出る
- プロジェクトの構成を確認
- Views や Pages フォルダーがない → API 専用プロジェクトと判断
- Program.cs を確認
UseSwagger(),UseSwaggerUI()があるか- あれば IsDevelopment 条件の内側だけになっていないか
- Swagger を常時有効にしてみる
- 条件分岐を外して常に
UseSwagger(),UseSwaggerUI()を呼ぶ
- 条件分岐を外して常に
- launchSettings.json で
launchUrlを"swagger"に設定 - F5 で起動 → Swagger UI が出ることを確認
ケース 2:MVC アプリのはずなのに、F5 しても「ようこそ」ページのみ
- Views/Home/Index.cshtml が存在するか確認
- Program.cs / Startup.cs のルート設定を確認
MapControllerRouteの defaults が Home/Index になっているか
- launchSettings.json の
launchUrlを確認- 空文字や “/” ではなく一度 “Home/Index” を指定してみる
- それでもダメな場合
- Program.cs に
app.MapGet("/", () => Results.Redirect("/Home/Index"));を追加
- Program.cs に
ケース 3:オンプレミス Web API をブラウザーで見ると既定ページのみ
- IIS マネージャーでサイト構成を確認
- アプリケーションが /App 以下にあるのか、ルートにあるのか
- ブラウザーでアクセスしている URL と一致しているか
- web.config の defaultDocument を確認
- 本来のエントリーポイント(Default.aspx や index.html)がリストの上位にあるか
- API エンドポイントに直接アクセスしてみる
- 例:
http://サーバー名/api/valuesなど - JSON が返ってくるならアプリ自体は動いている
- 例:
- UI が必要なら
- Swagger などの UI を後付けする
- 静的な案内ページを追加し、defaultDocument に設定する
よくある勘違いとベストプラクティス
「既定ページを削除すれば解決」は危険
テンプレートが作ってくれた既定ページを削除しても、ルート “/” の挙動が変わるわけではありません。削除してしまうと、最悪の場合は 404 エラーになるだけです。
大事なのは、
- ルート “/” に来たリクエストをどこに流すか(ルーティング、リダイレクト)
- 既定ドキュメントとしてどのファイルを返すか(UseDefaultFiles, defaultDocument)
を明示的に設計することです。「使っていない既定ページを削除する」のは最後の仕上げとして行い、まずはルートと起動 URL を正しく整える方が安全です。
API と UI を分けて考えると整理しやすい
既存のオンプレミス Web API をモダナイズするとき、
- API(データの入り口)
- UI(人間が操作する画面)
をきちんと分けて考えると、「どこで何を返すべきか」が整理しやすくなります。
- API 専用プロジェクト:Swagger / index.html で最低限の UI を用意する
- UI ありプロジェクト:ルート “/” を人間が最初に触れる画面に合わせる
- 大規模システム:フロントエンド(SPA)と Web API を別プロジェクトに分ける
こうした設計を先に固めておくと、「ビルドできるけど既定ページしか出ない」といった混乱を防ぎやすくなります。
本番で Swagger を出すかどうかは運用ポリシーで決める
セキュリティ上の理由から、本番環境では Swagger を閉じたいケースもあります。その場合でも、
- 開発・検証環境:Swagger 常時有効 + 起動 URL は /swagger
- 本番環境:ルート “/” はポータルサイトや利用者向けドキュメントにリダイレクト
といった風に、環境ごとに「/ にアクセスしたとき何を見せるか」を決めておくのがポイントです。単に Swagger を無効にするだけだと、今回のように「既定の ASP.NET ページだけが出る」状態になりがちです。
まとめ:原因を「コードのバグ」ではなく「入り口のずれ」として捉える
「ビルドは通るのに、既定の ASP.NET ページしか表示されない」という状況は、一見するとアプリが壊れているように見えます。しかし、実際には
- プロジェクトの種類(API なのか UI なのか)
- ルート “/” にアクセスしたときの挙動(ルーティング/既定ドキュメント)
- Visual Studio や IIS の起動 URL・サイト設定
といった「入り口周りの設定のずれ」であることがほとんどです。
まずはこの記事のチェックリストに沿って、
- API 専用プロジェクトかどうかを見極める
- Swagger や index.html で簡単な UI を用意する
- MVC / Razor / SPA の場合は、既定ルートと起動 URL をそろえる
- IIS / web.config の defaultDocument を確認する
といった手順を踏んでいけば、「既定ページしか出ない」状態から「本来のアプリ画面が自然に表示される」状態へと、無理なく移行できます。
既定ページを「邪魔者」と捉えるのではなく、「まだルートの入り口を自分たち用に作り替えていない」というサインとして捉え、設計と設定を見直していくのが、長期的にも運用しやすい解決策になります。

コメント