mcpField
A
aspnet-signalr

aspnet-signalr

github.com/claude-dev-suite開発4650 回インストール2 日前に更新
リポジトリ

aspnet-signalr について

リアルタイム通信を実装する開発者向けの ASP.NET Core SignalR クイックリファレンスです。Hubの設定、型付きクライアント、ストリーミング、認証、トラブルシューティングを扱います。

主な機能

  1. 01SignalR Hubのマッピング
  2. 02型付きHubクライアントの定義
  3. 03IHubContext経由のメッセージ送信
  4. 04サーバーとクライアント間のストリーミング
  5. 05Hubやメソッドへの認可設定

活用シーン

  1. 01リアルタイムチャット用Hubの設定
  2. 02Hubメソッド外からの通知送信
  3. 03接続中のクライアントへのデータ配信

インストール

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

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill aspnet-signalr

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

詳細

ASP.NET Core SignalR - クイックリファレンス

詳しい情報:包括的なドキュメントについては、technology: signalr を指定して mcp__documentation__fetch_docs を使用してください。

Hub の設定

// Program.cs
builder.Services.AddSignalR();
app.MapHub<ChatHub>("/hubs/chat");

厳密に型指定された Hub

public interface IChatClient
{
    Task ReceiveMessage(string user, string message);
    Task UserJoined(string user);
    Task UserLeft(string user);
}

public class ChatHub : Hub<IChatClient>
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.ReceiveMessage(user, message);
    }

    public async Task JoinRoom(string room)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, room);
        await Clients.Group(room).UserJoined(Context.User?.Identity?.Name ?? "Anonymous");
    }

    public async Task LeaveRoom(string room)
    {
        await Groups.RemoveFromGroupAsync(Context.ConnectionId, room);
        await Clients.Group(room).UserLeft(Context.User?.Identity?.Name ?? "Anonymous");
    }

    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception? exception)
    {
        await base.OnDisconnectedAsync(exception);
    }
}

Hub の外部からの送信

public class NotificationService
{
    private readonly IHubContext<ChatHub, IChatClient> _hubContext;

    public NotificationService(IHubContext<ChatHub, IChatClient> hubContext)
        => _hubContext = hubContext;

    public async Task NotifyUser(string userId, string message)
    {
        await _hubContext.Clients.User(userId).ReceiveMessage("System", message);
    }

    public async Task NotifyGroup(string group, string message)
    {
        await _hubContext.Clients.Group(group).ReceiveMessage("System", message);
    }
}

ストリーミング

public class StreamHub : Hub
{
    // Server to client streaming
    public async IAsyncEnumerable<int> Counter(int count, int delay,
        [EnumeratorCancellation] CancellationToken cancellationToken)
    {
        for (var i = 0; i < count; i++)
        {
            cancellationToken.ThrowIfCancellationRequested();
            yield return i;
            await Task.Delay(delay, cancellationToken);
        }
    }

    // Client to server streaming
    public async Task UploadStream(IAsyncEnumerable<string> stream)
    {
        await foreach (var item in stream)
        {
            // Process each item
        }
    }
}

認証

// Require auth on hub
[Authorize]
public class SecureHub : Hub<IChatClient>
{
    [Authorize(Roles = "Admin")]
    public async Task AdminAction() { }
}

// Access user info
public class ChatHub : Hub
{
    public async Task Send(string message)
    {
        var userId = Context.UserIdentifier; // From ClaimTypes.NameIdentifier
        var name = Context.User?.Identity?.Name;
    }
}

アンチパターン

アンチパターン問題点正しい方法
Hub に状態を保存するHub は一時的なものです外部ストレージまたはグループを使用する
厳密に型指定された Hub を使用しないコンパイル時の安全性がありませんHub<TClient> を使用する
Hub メソッドの実行時間が長い接続をブロックしますバックグラウンドサービスを使用する
切断を処理しないリソースリークが発生しますOnDisconnectedAsync をオーバーライドする

トラブルシューティング(クイックリファレンス)

問題考えられる原因解決策
接続が拒否されるHub がマッピングされていませんapp.MapHub<T>() を確認する
認証が機能しないトークンが送信されていませんWebSocket の場合はクエリ文字列でトークンを渡す
メッセージを受信できないクライアントメソッド名が間違っていますインターフェイスのメソッド名と完全に一致させる
スケーリングの問題バックプレーンがありませんRedis または Azure SignalR を使用する

コメント