Signalr 将消息从浏览器发送到同一台机器上的 .net 客户端
Signalr send message from browser to .net client on the same machine
我们需要将本机应用程序与 Web 应用程序进行通信。
我们想用signalr来发送message/command。
管道将是:
- 用户点击进行操作。
- Javascript(使用 signalr)在 azure 中向服务器发送消息。
- 服务器重新向特定客户端发送消息。必须是安装在同一台机器上的客户端。
- 完成结果后,NET 将结果反向发送。
问题是,如何在信号服务器中找到来自同一台机器的客户端?
我们系统中的组织是:
- 有center/gym.
- 每个中心都有可以登录的工作人员。
我们可以通过一些文件配置来识别同一中心的客户端。例如,保存我们的密钥中心。但是,在一个中心,是否可以在不同的计算机上安装超过 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
我们需要将本机应用程序与 Web 应用程序进行通信。
我们想用signalr来发送message/command。
管道将是:
- 用户点击进行操作。
- Javascript(使用 signalr)在 azure 中向服务器发送消息。
- 服务器重新向特定客户端发送消息。必须是安装在同一台机器上的客户端。
- 完成结果后,NET 将结果反向发送。
问题是,如何在信号服务器中找到来自同一台机器的客户端?
我们系统中的组织是:
- 有center/gym.
- 每个中心都有可以登录的工作人员。
我们可以通过一些文件配置来识别同一中心的客户端。例如,保存我们的密钥中心。但是,在一个中心,是否可以在不同的计算机上安装超过 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