mcpField
A
aspnet-core

aspnet-core

github.com/managedcode開発509116 回インストール1 日前に更新
リポジトリ

aspnet-core について

ASP.NET Core アプリやサービスの開発、デバッグ、モダナイズを支援するスキルです。リクエストパイプラインの順序、組み込みパターン、セキュリティ、対象を絞った検証を扱います。

主な機能

  1. 01ホスティング、ミドルウェア、認証、ルーティングの確認
  2. 02ミドルウェア順序パターンの適用
  3. 03組み込みの設定とロギングの利用
  4. 04よくあるセキュリティ・非同期処理の問題の回避
  5. 05ビルドとテストによる変更の検証

活用シーン

  1. 01リクエストパイプラインの動作調査
  2. 02認証やエンドポイントルーティングの変更
  3. 03旧式 ASP.NET アプリのモダナイズ
  4. 04ホスティングやデプロイの変更のレビュー

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/managedcode/dotnet-skills --skill aspnet-core

インストール後、Claude Code で/aspnet-coreを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

manifest.json
references/
anti-patterns.md
patterns.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 でよくある間違い

ワークフロー

  1. まず実際のホスティング構成を確認します。

    • トップレベルの Program.cs の構造
    • ミドルウェアの順序と登録
    • 認証モデル(Identity、JWT、OAuth、Cookie)
    • エンドポイントの登録とルーティング
  2. 適切なミドルウェアの順序に従います。

    ExceptionHandler → HttpsRedirection → Static Files → Routing
    → CORS → Authentication → Authorization → Rate Limiting
    → Response Caching → Custom Middleware → Endpoints
    
  3. 組み込みのパターンを正しく使用します。

    • 構成には IOptions<T> / IOptionsSnapshot<T> を優先します
    • 構造化ロギングには ILogger<T> を使用します
    • HTTP クライアントには IHttpClientFactory を使用します(new HttpClient() は使用しません)
    • バックグラウンド処理には IHostedService / BackgroundService を使用します
  4. 専門的な作業は、対応するスキルに割り当てます。

    • UI とコンポーネント → blazor
    • リアルタイム処理 → signalr
    • RPC → grpc
    • 新しい HTTP API → minimal-apis(コントローラーが必要な場合を除き、こちらを優先)
    • コントローラー API → web-api
  5. ビルド、テスト、対象エンドポイントの確認を行います。

最新のアップストリームに関する注意事項

  • 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()

パフォーマンスに関するベストプラクティス

  1. どこでも async/await を使用する — 同期的にブロックする呼び出しは避けます
  2. DbContext を適切にプールする — スコープ付きのライフタイムを使用します
  3. レスポンス圧縮を有効にする — UseResponseCompression()
  4. 出力キャッシュを使用する — .NET 7+ では UseOutputCache()
  5. 診断ツールでプロファイリングする — Visual Studio Diagnostic Tools、PerfView
  6. ホットパスでの割り当てを避ける — Span<T> とプーリングを使用します

提供内容

  • 本番環境で信頼できる ASP.NET Core のコードと設定
  • 明確なリクエストパイプラインとホスティングの説明
  • 影響を受けるエンドポイントとミドルウェアに即した検証
  • セキュリティヘッダーと HTTPS の適切な設定

検証

  • ミドルウェアの順序に意図があり、文書化されている
  • セキュリティと設定の変更が明示されている
  • エンドポイントの動作がテストまたはスモークチェックで網羅されている
  • 非同期コンテキストでブロッキング呼び出しがない
  • シークレットがソース管理にコミットされていない
  • 本番環境への対応としてヘルスチェックが実装されている

コメント