Setup:SignalR cliente viene ricollegato dopo Owin riavvio, ma il messaggio non è pubblicato
- SignalRServer console app: Microsoft.AspNet.SignalR.SelfHost v2.0.3
- SignalRClient console app: Microsoft .AspNet.SignalR.Client v2.0.3
- .NET 4.5.1
faccio la seguente:
- Hit entrare in cliente, viene ricevuto un messaggio sul server e sul client di nuovo
- Smaltire il server premendo un tasto qualsiasi della console del server
- Riavviare il server di un qualsiasi tasto nella console del server
- client viene ricollegato
- Hit entrare sul client, il messaggio viene ricevuto sul server, ma mai raggiunge di nuovo il cliente
Mi aspetto che il messaggio venga nuovamente ricevuto dal cliente. Sospetto che abbia qualcosa a che fare con l'auto-hosting, dal momento che ho provato a eseguire il client sullo stesso hub in un'applicazione Web che esegue IIS con successo.
Qualche idea?
Aggiornamento: se il processo della console del server viene interrotto e riavviato, è in grado di riconnettersi e recuperare nuovamente i messaggi.
codice Server
using System;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Hosting;
using Owin;
namespace SignalRServer
{
internal class Program
{
private static void Main(string[] args)
{
const string url = "http://localhost:8081";
while (true)
{
using (WebApp.Start<Startup>(url))
{
Console.WriteLine("Server running on {0}. Hit any key to stop.", url);
Console.ReadLine();
}
Console.WriteLine("Server stopped");
Console.WriteLine("Hit any key to restart, Esc to exit");
ConsoleKeyInfo ki = Console.ReadKey(true);
if (ki.Key == ConsoleKey.Escape)
return;
}
}
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
public class AuthenticationHub : Hub
{
public void BroadcastMessageToAll(string message)
{
Clients.All.sendMessageToClient(message);
Console.WriteLine("sendMessageToClient: " + message);
}
public override Task OnConnected()
{
Console.WriteLine("OnConnected " + Context.ConnectionId);
return base.OnConnected();
}
public override Task OnReconnected()
{
Console.WriteLine("OnReconnected " + Context.ConnectionId);
return base.OnReconnected();
}
public override Task OnDisconnected()
{
Console.WriteLine("OnDisconnected " + Context.ConnectionId);
return base.OnReconnected();
}
}
}
Codice cliente
using System;
using Microsoft.AspNet.SignalR.Client;
namespace SignalRClient
{
class Program
{
static void Main(string[] args)
{
while (true)
{
var hubConnection = new HubConnection("http://localhost:8081/signalr/hubs");
hubConnection.Closed +=() => Console.WriteLine("Closed");
hubConnection.StateChanged += e => Console.WriteLine("StateChanged: " + e.OldState + " " + e.NewState);
var hubProxy = hubConnection.CreateHubProxy("AuthenticationHub");
hubProxy.On<string>("sendMessageToClient",
info => Console.WriteLine("sendMessageToClient received: " + info));
hubConnection.Start();
Console.WriteLine("Client started - hit Enter to send a message - ESC to stop");
Console.ReadKey();
while (true)
{
var keyInfo = Console.ReadKey(true);
if (keyInfo.Key == ConsoleKey.Escape)
break;
var message = "Console client : " + DateTime.Now.ToString("HH:mm:ss-fff");
hubProxy.Invoke("BroadcastMessageToAll", message);
Console.WriteLine("Client sent BroadcastMessageToAll: " + message);
}
Console.WriteLine("Client stopping");
hubConnection.Stop();
Console.WriteLine("Client stopped - enter any key start again");
Console.ReadLine();
}
}
}
}
Vorrei poter aiutare di più, ma ho copiato il server e il codice del client letteralmente in due console progetti di app. Dopo aver installato i pacchetti NuGet necessari, sono stato in grado di riavviare l'app del server, fare in modo che il client si ricolleghi automaticamente e quindi continuare a inviare e ricevere messaggi in seguito. – halter73
Ho aggiornato i passaggi da riprodurre per essere più precisi. È necessario riavviare l'app della console del server stessa, ma l'app del server SignalR stessa. – Stian