aspnet-signalr について
リアルタイム通信を実装する開発者向けの ASP.NET Core SignalR クイックリファレンスです。Hubの設定、型付きクライアント、ストリーミング、認証、トラブルシューティングを扱います。
主な機能
- 01SignalR Hubのマッピング
- 02型付きHubクライアントの定義
- 03IHubContext経由のメッセージ送信
- 04サーバーとクライアント間のストリーミング
- 05Hubやメソッドへの認可設定
活用シーン
- 01リアルタイムチャット用Hubの設定
- 02Hubメソッド外からの通知送信
- 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 を使用する |
コメント
Markdown 対応