Мне кажется, что я либо упускаю суть сервиса SignalR, либо неправильно понял архитектуру.
Используя службу Azure SignalR, у меня связь между интерфейсом и интерфейсом работает как таковая;
Startup.cs
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
app.MapAzureSignalR(this.GetType().FullName);
}
Hub.cs
private void BroadcastMessage(string message)
{
Clients.All.broadcastMessage(message);
}
Index.html
hubName.client.broadcastMessage = function (message) {
alert(message);
};
$('#btn').click(function () {
hubName.server.broadcastMessage("Hello World");
});
Это нормально, и когда мне нужен сервер, чтобы вызвать сообщение, я использую следующее:
Functions.cs
HubConnection signalr = new HubConnection("http://localhost:57690/");
IHubProxy hub = null;
if (signalr.State == ConnectionState.Disconnected)
{
hub = signalr.CreateHubProxy(hubName);
signalr.Start().Wait();
}
hub.Invoke(functionName, args);
signalr.Stop();
Хотя это работает, меня интересует, правильно ли я это реализовал, так как это оставляет http://localhost:57690/signalr/hubs
открытым для сообщений из любого источника.
В клиентском интерфейсе я должен предоставить параметр Endpoint=https://appName.service.signalr.net;AccessKey=xxxxx
, но не из серверного.
Помимо вопросов безопасности, это заставляет меня задаться вопросом, для чего в этом заключается служба SignalR.
Наверняка должен быть лучший способ вызвать сигнализатор из серверной части.
Большое спасибо,
Tom