Saya memiliki hub SignalR yang sangat sederhana yang aktif dan berjalan di server saya. Menggunakan contoh dari Micorsoft, saya membuat penyimpanan dalam memori untuk memetakan pengguna dari ClaimsPrincipal ke kamus dalam memori. Ini kodenya:
public class NotificationHub : Hub
{
private readonly static ConnectionMapping<string> _connections = new ConnectionMapping<string>();
public void SendNotification(string who, NotificationData message)
{
string name = Context.User.Identity.Name;
foreach(var connectionId in _connections.GetConnections(who))
{
Clients.Client(connectionId).SendAsync("Notification", message);
}
}
public override Task OnConnectedAsync()
{
string name = Context.UserIdentifier;
_connections.Add(name, Context.ConnectionId);
return base.OnConnectedAsync();
}
public override Task OnDisconnectedAsync(System.Exception exception)
{
string name = Context.User.Identity.Name;
_connections.Remove(name, Context.ConnectionId);
return base.OnDisconnectedAsync(exception);
}
}
Saya ingin menguji ini dengan aplikasi konsol, tetapi saya tidak dapat menemukan cara membuat ClaimsPrincipal di aplikasi konsol inti .net. Ini kode aplikasi konsol saya:
class Program
{
static async Task Main(string[] args)
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
Console.WriteLine("Press a key to start listening");
Console.ReadKey();
Console.WriteLine("Client Listening!");
var connection = new HubConnectionBuilder()
.WithUrl("https://localhost:44375/Notify")
.WithAutomaticReconnect(new[] { TimeSpan.Zero, TimeSpan.Zero, TimeSpan.FromSeconds(10) })
//.ConfigureLogging(logging =>
//{
// logging.AddConsole();
// logging.SetMinimumLevel(LogLevel.Debug);
//})
.Build();
connection.On<NotificationData>("Notification", (notificationData) =>
Console.WriteLine($"Somebody connected: {notificationData.ClientId}"));
connection.StartAsync().GetAwaiter().GetResult();
while(Console.ReadKey().Key == ConsoleKey.S)
{
var msg = new NotificationData { ClientId = Guid.NewGuid().ToString(), Notifications = null };
await connection.SendAsync("SendNotification", msg);
}
Console.WriteLine("Listening. Press a key to quit");
Console.ReadKey();
connection.Reconnecting += error =>
{
Console.WriteLine("Reconnecting...");
return Task.CompletedTask;
};
}
}
Saya mencoba menggunakan WindowsPrincipal tetapi tidak berhasil mengirimkan namanya. Tampaknya SignalR perlu memiliki prinsip klaim. Bagaimana cara mengirimkan klaim utama dari aplikasi konsol?