我认为此问题之前可能已被问过,但我发现还没有成功实施,所以这促使我问了一个新问题。
我的场景看起来像这样:我有一台服务器(在ASP.Net站点下运行)。主要的SignalR服务器使用OWIN在应用程序中自托管。假设这是在localhost:8181
下运行的。我有一个中央集线器,包含客户端和服务器本身之间通信所需的所有功能。在正常使用情况下,客户端会调用此端点:http://localhost:8181/signalr/hubs
。
现在,我想添加另一个不同的SignalR端点,如http://localhost:8282/signalr2/hubs
。原因是,在中央集线器中,我有一个仅由特定客户端使用的功能。特殊客户端是我希望能够调用该功能的唯一客户端,在其中,数据被传输到第一个端点中的其他客户端。从理论上讲,我可以使用一个端点并管理它们,但我想将特殊客户端分开,以便于调试和维护,以及提高性能。
现在,我可以在同一个ASP.Net应用程序中使用不同的配置启动它们。来自所有客户的连接,包括特殊客户端都在工作。除此之外,我不知道过滤特殊客户端并将数据发送给其他客户端的好方法。
以下是我已实施的两个端点的配置代码:
public class SignalRStartup
{
public void Configuration(IAppBuilder app)
{
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true,
EnableJavaScriptProxies = true
};
app.UseCors(CorsOptions.AllowAll);
app.UseErrorPage(new Microsoft.Owin.Diagnostics.ErrorPageOptions { ShowExceptionDetails = true });
app.MapSignalR(hubConfiguration);
}
}
public class SignalR2Startup
{
public void Configuration(IAppBuilder app)
{
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true,
EnableJavaScriptProxies = true,
};
app.UseCors(CorsOptions.AllowAll);
app.UseErrorPage(new Microsoft.Owin.Diagnostics.ErrorPageOptions { ShowExceptionDetails = true });
app.MapSignalR("/signalr2", hubConfiguration);
}
}
在Application_Start()
中,我添加了以下内容:
_signalR = WebApp.Start<SignalRStartup>("http://localhost:8181");
_signalR2 = WebApp.Start<SignalR2Startup>("http://localhost:8282");
示例中心代码:
[HubName("NotificationHub")]
public class NotificationHub : Hub
{
// Special client invoke this, the msg is passed to other clients in the 8181 endpoint
public void A(string msg)
{
// This Clients object should refer to other clients in 8181 endpoint
Clients.All.sendMsg(msg);
}
}
由于Clients
由GlobalHost
自动解决,这意味着它包含所有客户端,没有任何例外。
所以我的问题是,为了实现我的场景,正确的实现是什么?另外,如果我们使用正确的实现,如何找出正确的客户端,那么发送可以排除?
总结:
SignalR 1 & SignalR 2 has same NotificationHub with function A
Client 1 -> SignalR 1 (localhost:8181)
Client 2 -> SignalR 1 (localhost:8181)
SpecialClient -> Signalr 2 (localhost:8282)
SpecialClient invoke A(), in which, data is send to Client 1 & Client 2, exclude SpecialClient
答案 0 :(得分:0)
特殊客户端是我希望能够调用的唯一客户端 该功能在其中,数据被传输到其他客户端
最简单的方法是不要将它们分开。
在某种程度上,你必须知道是什么让那个客户&#34;特别&#34;并且你可以将它们放在一个角色中,让他们可以访问其他客户端无法访问的方法。
限制对某些方法的访问 -
[Authorize(Roles = "Admin")]
public class AdminAuthHub : Hub
{
}
查找更多信息 - https://docs.microsoft.com/en-us/aspnet/signalr/overview/security/hub-authorization
如何向客户发送数据 - &gt; Clients.Others
将发送给除发件人(特殊客户端)之外的所有人。但是你也可以把你的特殊客户放在&#34;特别的&#34;集团和所有其他客户在&#34;非特殊&#34;分组,仅使用Clients.Group