aspnet-core について
ASP.NET Core アプリやサービスの開発、デバッグ、モダナイズを支援するスキルです。リクエストパイプラインの順序、組み込みパターン、セキュリティ、対象を絞った検証を扱います。
主な機能
- 01ホスティング、ミドルウェア、認証、ルーティングの確認
- 02ミドルウェア順序パターンの適用
- 03組み込みの設定とロギングの利用
- 04よくあるセキュリティ・非同期処理の問題の回避
- 05ビルドとテストによる変更の検証
活用シーン
- 01リクエストパイプラインの動作調査
- 02認証やエンドポイントルーティングの変更
- 03旧式 ASP.NET アプリのモダナイズ
- 04ホスティングやデプロイの変更のレビュー
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ managedcode/ dotnet-skills --skill aspnet-coreインストール後、Claude Code で/aspnet-coreを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.jsonreferences/anti-patterns.mdpatterns.md詳細
ASP.NET Core
対象となる場面
- ASP.NET Core アプリ、サービス、ミドルウェアを開発している場合
- 認証、ルーティング、構成、ホスティング、デプロイの動作を変更する場合
- Blazor、Minimal APIs、コントローラー API など、ASP.NET Core のサブスタックから選択する場合
- リクエストパイプラインの問題をデバッグする場合
- レガシーな ASP.NET を ASP.NET Core に移行する場合
ドキュメント
参考資料
- patterns.md - ミドルウェア、セキュリティ、構成、DI、エラー処理、ロギングの各パターンの詳細
- anti-patterns.md -
HttpClientの誤用、非同期処理のアンチパターン、構成エラー、DI の問題、ミドルウェアの順序の問題、セキュリティの脆弱性など、ASP.NET Core でよくある間違い
ワークフロー
-
まず実際のホスティング構成を確認します。
- トップレベルの
Program.csの構造 - ミドルウェアの順序と登録
- 認証モデル(Identity、JWT、OAuth、Cookie)
- エンドポイントの登録とルーティング
- トップレベルの
-
適切なミドルウェアの順序に従います。
ExceptionHandler → HttpsRedirection → Static Files → Routing → CORS → Authentication → Authorization → Rate Limiting → Response Caching → Custom Middleware → Endpoints -
組み込みのパターンを正しく使用します。
- 構成には
IOptions<T>/IOptionsSnapshot<T>を優先します - 構造化ロギングには
ILogger<T>を使用します - HTTP クライアントには
IHttpClientFactoryを使用します(new HttpClient()は使用しません) - バックグラウンド処理には
IHostedService/BackgroundServiceを使用します
- 構成には
-
専門的な作業は、対応するスキルに割り当てます。
- UI とコンポーネント →
blazor - リアルタイム処理 →
signalr - RPC →
grpc - 新しい HTTP API →
minimal-apis(コントローラーが必要な場合を除き、こちらを優先) - コントローラー API →
web-api
- UI とコンポーネント →
-
ビルド、テスト、対象エンドポイントの確認を行います。
最新のアップストリームに関する注意事項
- ASP.NET Core
v10.0.11は、新しいプログラミングモデルを導入するリリースではなく、サービス更新リリースです。OpenAPI を2.7.5に更新し、期限切れになったクライアント永続化 Blazor 回路状態の復元を修正し、サービス関連の依存関係を更新しています。既存のミドルウェアとエンドポイントのアーキテクチャを維持し、OpenAPI、インタラクティブレンダリング、認証、起動のテストを重点的に再実行してください。 aspnetcore-10.0向けの 2026 年 8 月版 Microsoft Learn の概要は、Blazor、Minimal APIs、コントローラー API、SignalR、gRPC のどれを選ぶかを判断する際のルーティングの参照先として、引き続き有効です。この更新だけを理由に、既存のアプリモデルを変更する必要はありません。
ミドルウェアのパターン
正しい順序が重要です
var app = builder.Build();
app.UseExceptionHandler("/error"); // 1. Catch all exceptions
app.UseHsts(); // 2. Security headers
app.UseHttpsRedirection(); // 3. HTTPS redirect
app.UseStaticFiles(); // 4. Serve static files
app.UseRouting(); // 5. Route matching
app.UseCors(); // 6. CORS policy
app.UseAuthentication(); // 7. Who are you?
app.UseAuthorization(); // 8. Can you access?
app.UseRateLimiter(); // 9. Rate limiting
app.UseResponseCaching(); // 10. Response cache
app.MapControllers(); // 11. Endpoints
カスタムミドルウェアのパターン
public class RequestTimingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<RequestTimingMiddleware> _logger;
public RequestTimingMiddleware(RequestDelegate next, ILogger<RequestTimingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
var sw = Stopwatch.StartNew();
await _next(context);
_logger.LogInformation("Request {Path} completed in {Elapsed}ms",
context.Request.Path, sw.ElapsedMilliseconds);
}
}
構成のパターン
強い型付けを使用したオプション
// appsettings.json
{
"EmailSettings": {
"SmtpServer": "smtp.example.com",
"Port": 587
}
}
// Registration
builder.Services.Configure<EmailSettings>(
builder.Configuration.GetSection("EmailSettings"));
// Usage
public class EmailService(IOptions<EmailSettings> options)
{
private readonly EmailSettings _settings = options.Value;
}
環境に基づく構成
builder.Configuration
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables()
.AddUserSecrets<Program>(optional: true);
セキュリティのパターン
認証の設定
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]!))
};
});
認可ポリシー
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy =>
policy.RequireRole("Admin"));
options.AddPolicy("MinAge18", policy =>
policy.RequireClaim("Age", "18", "19", "20")); // simplified
});
避けるべきアンチパターン
| アンチパターン | 問題点 | より良い方法 |
|---|---|---|
new HttpClient() | ソケットの枯渇 | IHttpClientFactory |
同期処理による非同期処理の呼び出し(Task.Result) | スレッドプールの枯渇 | 適切に await を使用する |
appsettings.json へのシークレットの保存 | セキュリティ上のリスク | User Secrets、Key Vault |
| すべての例外を黙って捕捉する | バグが隠れる | IExceptionHandler を使用する |
ミドルウェアでの async void | プロセスがクラッシュする | async Task |
| HTTPS リダイレクトの欠落 | セキュリティ上のリスク | UseHttpsRedirection() |
パフォーマンスに関するベストプラクティス
- どこでも async/await を使用する — 同期的にブロックする呼び出しは避けます
- DbContext を適切にプールする — スコープ付きのライフタイムを使用します
- レスポンス圧縮を有効にする —
UseResponseCompression() - 出力キャッシュを使用する — .NET 7+ では
UseOutputCache() - 診断ツールでプロファイリングする — Visual Studio Diagnostic Tools、PerfView
- ホットパスでの割り当てを避ける —
Span<T>とプーリングを使用します
提供内容
- 本番環境で信頼できる ASP.NET Core のコードと設定
- 明確なリクエストパイプラインとホスティングの説明
- 影響を受けるエンドポイントとミドルウェアに即した検証
- セキュリティヘッダーと HTTPS の適切な設定
検証
- ミドルウェアの順序に意図があり、文書化されている
- セキュリティと設定の変更が明示されている
- エンドポイントの動作がテストまたはスモークチェックで網羅されている
- 非同期コンテキストでブロッキング呼び出しがない
- シークレットがソース管理にコミットされていない
- 本番環境への対応としてヘルスチェックが実装されている
コメント
Markdown 対応