同一服务器

时间:2017-09-30 02:55:55

标签: asp.net signalr

我认为此问题之前可能已被问过,但我发现还没有成功实施,所以这促使我问了一个新问题。

我的场景看起来像这样:我有一台服务器(在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);
    }
}

由于ClientsGlobalHost自动解决,这意味着它包含所有客户端,没有任何例外。 所以我的问题是,为了实现我的场景,正确的实现是什么?另外,如果我们使用正确的实现,如何找出正确的客户端,那么发送可以排除?

的消息

总结:

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

1 个答案:

答案 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

向您想要的群组广播