コントローラもアクションもあるのに 404。ルーティング・属性・エンドポイント登録のどれかが外れていることが多い。
先に結論
- まず URL とルートテンプレート(conventional / attribute)を突き合わせる
[Route] / [HttpGet] のテンプレートと HTTP メソッドを確認
MapControllers / UseEndpoints / Minimal API の登録漏れを疑う
- エリア・プレフィックス・バージョン・ホスト制約も候補
チェックリスト
- 実際に叩いているパス(先頭スラッシュ・大文字小文字・末尾スラッシュ)
- コントローラ名の規約(
XxxController)とルート名
- アクションの HTTP 属性がリクエストメソッドと一致しているか
app.MapControllers() が呼ばれているか(ミドルウェア順も)
[ApiController] + 属性ルーティングのみで、従来ルートが無い構成になっていないか
- 認証で 401/403 ではなく、本当に 404 か(ログで確認)
よくある原因
[Route("api/[controller]")] なのに /api/values/... 以外を叩いている
- アクションに
[HttpPost] しか無いのに GET で試している
- 別プロジェクトのコントローラで、参照・起動アセンブリが違う
- パスベースのリバースプロキシでプレフィックスが削れている/付いている
確認のコツ
- 起動時にエンドポイントルート一覧を出す(デバッグ時)
- Swagger / OpenAPI に出るかで「登録されているか」を見る
- 404 ボディが空なら、ミドルウェアの早い段階で落ちていないかも見る
関連: DI Unable to resolve service(コントローラ生成失敗は別症状)
ざっくりまとめ
- URL・属性・MapControllers の三点セット
- メソッド不一致とプレフィックスずれが多い
- Swagger に出るかで登録有無を切り分ける
関連記事