У меня есть собственный сервер SignalR, использующий Owin и SignalR.SelfHost в консольном приложении, также есть (консольный проект .Net) клиент (использующий пакет NuGet SignalR.Client), после того как сервер размещен, я могу установить соединение склиент, я вижу один и тот же идентификатор соединения на стороне клиента и HubCallerContext.ConnectionId в Hub в методе OnConnected. Но когда я пытаюсь вызвать метод «ReceiveMessage» на клиенте, используя «GlobalHost.ConnectionManager.GetHubContext» и «Context.Clients.All.InvokeAsync (« ReceiveMessage »)», он не достигает клиента (также не исключение)). Я хочу, чтобы это соединение было одним из способов на данный момент, то есть с сервера на клиент (только push-уведомления с сервера). И сервер, и клиент находятся в .net Framework (не .Net Core). Идентификатор соединения, который я вижу в Global HubContext, отличается от идентификатора соединения с клиентом.
1) Код на стороне сервера,
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
public static MonitoringContext _monitoringContext;
static void Main(string[] args)
{
// Start OWIN host
using (WebApp.Start<Startup>("http://localhost:49632/"))
{
Console.WriteLine("Server running on {0}", "http://localhost:49632/");
_monitoringContext = new MonitoringContext();
RunLoop();
//SetTimer();
Console.ReadLine();
}
}
private static void RunLoop()
{
do
{
Thread.Sleep(5000);
_monitoringContext.CallHubClients();
} while (true);
}
public class MonitoringContext
{
IHubContext _hubContext;
public MonitoringContext()
{
_hubContext = GlobalHost.ConnectionManager.GetHubContext<MonitoringHub>();
}
public void CallHubClients()
{
Console.WriteLine("Calling client with ID....");
_hubContext.Clients.All.InvokeAsync("ReceiveMessage");
}
}
[HubName("MonitoringHub")]
public class MonitoringHub : Hub
{
public override Task OnConnected()
{
Console.WriteLine("Client connected...." + this.Context.ConnectionId);
return base.OnConnected();
}
public override Task OnReconnected()
{
return base.OnReconnected();
}
public override Task OnDisconnected(bool stopCalled)
{
Console.WriteLine("Client disconnected....");
return base.OnDisconnected(stopCalled);
}
}
2) Код на стороне клиента -
static HubConnection connection;
static IHubProxy _hubProxy;
static Action OnReceivedAction;
public async void RegisterClient()
{
OnReceivedAction = ReceiveMessage;
connection = new HubConnection("http://localhost:49632/");
_hubProxy = connection.CreateHubProxy("MonitoringHub");
_hubProxy.On("ReceiveMessage", OnReceivedAction);
await connection.Start();
Console.WriteLine("Hub connection started with ID...." + connection.ConnectionId );
}
public void ReceiveMessage()
{
Console.WriteLine("Message Received....Hurrey!!");
}