Я работаю над соединением SignalR Clinet-Server.Мой сервер WebApi Core 2.1
, а мой клиент WPF .NET Framework 4.7.2
.
На стороне клиента у меня есть singleton
служба-концентратор с одним экземпляром для получения сообщений от сервера:
using System.Collections.ObjectModel;
using Microsoft.AspNetCore.SignalR.Client;
public class HubService
{
//singleton
public static HubService Instance { get; } = new HubService();
public ObservableCollection<string> Notifications { get; set; }
public async void Initialize()
{
this.Notifications = new ObservableCollection<string>();
var hubConnection = new HubConnectionBuilder()
.WithUrl(UrlBuilder.BuildEndpoint("Notifications"))
.Build();
hubConnection.On<string>("ReciveServerUpdate", update =>
{
//todo
});
await hubConnection.StartAsync();
}
}
я инициализирую его как синглтон:
public MainWindowViewModel()
{
HubService.Instance.Initialize();
}
Пока я отлаживаю, на MainWindowViewModel
я нажимаю, что HubService
.
На Server
стороне это выглядит так:
Hub
:
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;
public class NotificationsHub : Hub
{
public async Task GetUpdateForServer(string call)
{
await this.Clients.Caller.SendAsync("ReciveServerUpdate", call);
}
}
Я запускаю отправку сообщения таким образом в методах моего контроллера:
[HttpPost]
public async Task<IActionResult> PostTask([FromBody] Task task)
{
if (!this.ModelState.IsValid)
{
return this.BadRequest(this.ModelState);
}
this.taskService.Add(task);
//here im calling sending message. When im debugging
//i see one connection from my WPF with unique ConnectionId
await this.notificationsHub.Clients.All.SendAsync("ReciveServerUpdate", "New Task in database!");
return this.Ok(task);
}
Как я писал ранее, пока я отлаживаю WebApi
, в Clients
у меня ровно одно соединение с моим WPF
.Когда я отключаю WPF
, connection count = 0
, чтобы соединения работали отлично.
Но когда я звоню SendAsync()
, я не получаю никакой информации в WPF
в hubConnection.On
.Забавно, вчера все работает отлично.
Итак, мои мысли о том, чтобы сделать HubService
статическим singleton
, верны?Если это так, почему я не могу получить сообщения от WebApi
по SignalR
, когда к нему подключен мой WPF
?
Вчера я спросил что-то похожее, но нашел решение для этого.Вчера мои методы работали, я могу нажать hubConnection.On
, когда получу сообщение от WebApi
. Мой вопрос с вчерашнего дня .
РЕДАКТИРОВАТЬ
Ввод HUb
в контроллер:
private readonly ITaskService taskService;
private readonly IHubContext<NotificationsHub> notificationsHub;
public TaskController(ITaskService taskService, IHubContext<NotificationsHub> notificationsHub)
{
this.taskService = taskService;
this.notificationsHub = notificationsHub;
}
И Startup.cs
только SignalR
вещей (я удалил другие вещине относится к сигналу):
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR(routes => routes.MapHub<NotificationsHub>("/Notifications"));
}
EDIT2
Вот соединение, которое я могу получить, когда мой клиент WPF
зарегистрирует свое соединение: