Signalr 将消息从浏览器发送到同一台机器上的 .net 客户端

Signalr send message from browser to .net client on the same machine

我们需要将本机应用程序与 Web 应用程序进行通信。

我们想用signalr来发送message/command。

管道将是:

问题是,如何在信号服务器中找到来自同一台机器的客户端?

我们系统中的组织是:

我们可以通过一些文件配置来识别同一中心的客户端。例如,保存我们的密钥中心。但是,在一个中心,是否可以在不同的计算机上安装超过 one.NET 个客户端。

我们想到用电脑的私有IP在signalr服务器上做一个key

var ips = [];

    var RTCPeerConnection = window.RTCPeerConnection ||
        window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

    var pc = new RTCPeerConnection({
        // Don't specify any stun/turn servers, otherwise you will
        // also find your public IP addresses.
        iceServers: []
    });
    // Add a media line, this is needed to activate candidate gathering.
    pc.createDataChannel('');

    // onicecandidate is triggered whenever a candidate has been found.
    pc.onicecandidate = function (e) {
        if (!e.candidate) { // Candidate gathering completed.
            pc.close();
            console.log(ips);
            return;
        }
        var ip = /^candidate:.+ (\S+) \d+ typ/.exec(e.candidate.candidate)[1];

        ips.push(ip);
    };
    pc.createOffer(function (sdp) {
        pc.setLocalDescription(sdp);
    }, function onerror() { });

这个数据在.NET客户端中可以毫无问题的获取。但是在 javascript 中,之前的代码正常工作。在某些 PC 中,它只有 returns ipv4。在 Mozilla 中它不起作用。

我们如何识别这两个客户?您知道达到目标的另一种方法吗?

谢谢,

最后没找到过滤ip地址的好办法

我们做了如下操作:

我们使用 URI 架构来启动我们的应用程序。 URI Schema windows


    Public Class RegistrarURI


        Const URI_SCHEME As String = "xxx"
        Const URI_KEY As String = "URL:xxx"
        Private Shared APP_PATH As String = Location.AssemblyDirectory() ' "C:\Program Files (x86)\xxx.exe"

        Public Shared Sub RegisterUriScheme()

            Using hkcrClass As RegistryKey = Registry.ClassesRoot.CreateSubKey(URI_SCHEME)
                hkcrClass.SetValue(Nothing, URI_KEY)
                hkcrClass.SetValue("URL Protocol", [String].Empty, RegistryValueKind.[String])

                Using defaultIcon As RegistryKey = hkcrClass.CreateSubKey("DefaultIcon")
                    Dim iconValue As String = [String].Format("""{0}"",0", APP_PATH)
                    defaultIcon.SetValue(Nothing, iconValue)
                End Using

                Using shell As RegistryKey = hkcrClass.CreateSubKey("shell")
                    Using open As RegistryKey = shell.CreateSubKey("open")
                        Using command As RegistryKey = open.CreateSubKey("command")
                            Dim cmdValue As String = [String].Format("""{0}"" ""%1""", APP_PATH)
                            command.SetValue(Nothing, cmdValue)
                        End Using
                    End Using
                End Using
            End Using
        End Sub

    End Class

在 Azure WebApp 中,我们启动 SignalR 服务器。该服务器会将数据从我们的 .NET 应用程序发送到 Chrome。

为了实现这一点,当网页加载时,我们连接到 signalR 服务器。为了构建 de uri,我们将 connectionId 从 Javascript 客户端发送到 .NET 客户端。

然后,当本机进程完成时。 .NET 客户端将信息发送到 signalR 服务器,该服务器使用 connectionId 将数据镜像到 javacript 客户端。

为了避免启动我们本机应用程序的某些实例,我们使用 IPC 通道将数据发送到一个实例到前一个实例并关闭新实例。

Link 来源 Blog source