Signalr отправляет сообщение из браузера клиенту.net на той же машине
Нам нужно связать нативное приложение с веб-приложением.
Мы думаем использовать сигнализатор для отправки сообщения / команды.
Трубопровод будет:
- Пользователь нажимает, чтобы совершить действие.
- Javascript (с сигнализатором) отправляет сообщение на сервер в Azure.
- Сервер повторно отправит сообщение конкретному клиенту. Это должен быть клиент, установленный на той же машине.
- Как только результат завершен, NET отправляет полученный результат в обратном порядке.
Дело в том, как я могу найти клиента с той же машины в Сервере сигнализации?
Организация в нашей системе:
- Есть центр / тренажерный зал.
- В каждом центре есть сотрудники, которые могут войти.
Мы могли бы идентифицировать клиента в том же центре с некоторой конфигурацией файла. Сохранение нашего ключевого центра, например. Но в центре может быть установлено более одного клиента.NET на другом компьютере.
Мы думаем использовать частный IP-адрес компьютера, чтобы создать ключ на сервере сигнализатора.
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 предыдущий код работает регулярно. На некоторых ПК он возвращает только ipv4. И в Мозилле это не работает.
Как мы можем идентифицировать обоих клиентов? Знаете ли вы другой способ достижения цели?
Спасибо,
1 ответ
Наконец, мы не нашли хорошего решения для фильтрации IP-адресов.
Мы сделали следующее:
Мы использовали схему URI для запуска нашего приложения. Окна схемы URI
Public Class RegistrarURI Const URI_SCHEME As String = "xxx" Const URI_KEY As String = "URL:xxx" Частный общий APP_PATH как строка = Location.AssemblyDirectory() ' "C:\Program Files (x86)\xxx.exe" Публичный общий субрегистр UriScheme() Использование hkcrClass As RegistryKey = Registry.ClassesRoot.CreateSubKey(URI_SCHEME) hkcrClass.SetValue(ничего, URI_KEY) hkcrClass.SetValue("Протокол URL", [String].Empty, RegistryValueKind.[String]) Использование defaultIcon As RegistryKey = hkcrClass.CreateSubKey("DefaultIcon") Dim iconValue As String = [String].Format("""{0}"",0", APP_PATH) defaultIcon.SetValue(Ничего, iconValue) Конец использования Использование оболочки As RegistryKey = hkcrClass.CreateSubKey("shell") Использование open As RegistryKey = shell.CreateSubKey("open") Использование команды As RegistryKey = open.CreateSubKey("команда") Dim cmdValue As String = [String].Format("""{0}"" ""%1""", APP_PATH) command.SetValue(ничего, cmdValue) Конец использования Конец использования Конец использования Конец использования End Sub Конечный класс
В веб-приложении Azure мы запускаем сервер SignalR. Этот сервер будет отправлять данные из нашего приложения.NET в Chrome.
Для этого при загрузке сети мы подключаемся к серверу signalR. Для создания deri, мы отправляем ID соединения из клиента Javascript в клиент.NET.
Затем, когда родной процесс завершен. Клиент.NET отправляет информацию на сервер signalR, и этот сервер зеркально отображает данные на клиенте javacript, используя идентификатор соединения.
Чтобы избежать запуска какого-либо экземпляра нашего собственного приложения, мы используем канал IPC для отправки данных в один экземпляр в предыдущий и закрытия нового.
Ссылка на источник Блог источник