#c# #asp.net-core-mvc #signalr
#c# #asp.net-core-mvc #signalr
Вопрос:
У меня есть ASP.NET Основной веб-сайт MVC 5. Я использую SignalR для отправки «Уведомлений» с уровня модели клиенту / представлению.
Если я открываю свою индексную страницу, она использует SignalR для отправки списка доступных камер по мере их обнаружения. Затем я снова использую SignalR для отправки изображений, которые камера снимает на другой модели. Однако работает только первый.
Если я перейду к https://localhost:44303/camera/live/?IP=192.168.50.212
нему, он начнет отправлять изображения, но не обнаружит другие камеры. Если я сначала перейду к обнаружению, обнаружение будет работать просто отлично.
В обеих моделях строка Hub.Clients.All.SendAsync("method", data);
выполняется. В обеих моделях концентратор определяется как
public Microsoft.AspNetCore.SignalR.IHubContext<MasterHub> Hub { get; internal set; }`
и каждая модель имеет отдельный контроллер, который задает контекст концентратора следующим образом:
private readonly IHubContext<MasterHub> _hubContext;
public CameraController(IHubContext<MasterHub> hubContext)
{
_hubContext = hubContext;
}
Однако работает только первый, к которому я обращаюсь.
Должен ли я закрывать соединение SignalR после отправки сообщения, чтобы использовать его снова? Если да, то как мне это сделать?
оба контроллера выглядят так:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Thermal_Screening.Hubs;
using Thermal_Screening.Models;
namespace Thermal_Screening.Controllers
{
public class CameraController : Controller
{
public string CameraName;
private readonly IHubContext<MasterHub> _hubContext;
public CameraController(IHubContext<MasterHub> hubContext)
{
_hubContext = hubContext;
}
public IActionResult Live(string IP)
{
CameraName = getCameraNameFromIP(IP); // doin it this way causes a 2s delay, should get ip in model
return View(new CameraViewModel(IP) { Hub = _hubContext, IP = IP, CameraName = CameraName });
}
public IActionResult Settings(string IP)
{
CameraName = getCameraNameFromIP(IP);
return View(new CameraViewModel(IP) { Hub = _hubContext, IP = IP, CameraName = CameraName });
}
public IActionResult Log(string IP)
{
CameraName = getCameraNameFromIP(IP);
return View(new CameraViewModel(IP) { Hub = _hubContext, IP = IP, CameraName = CameraName });
}
private string getCameraNameFromIP(string IP)
{
WebClient x = new WebClient();
string source = x.DownloadString("http://" IP);
return Regex.Match(source, @"<titleb[^>]*>s*(?<Title>[sS]*?)</title>", RegexOptions.IgnoreCase).Groups["Title"].Value;
}
}
}
обе модели представления выглядят так:
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Extensions;
using Flir.Atlas.Live.Discovery;
using Flir.Atlas.Live.Device;
using Flir.Atlas.Live;
using System.IO;
using Flir.Atlas.Image;
using System.Drawing;
using Microsoft.AspNetCore.SignalR;
using Thermal_Screening.Hubs;
namespace Thermal_Screening.Models
{
public class CameraViewModel
{
public Microsoft.AspNetCore.SignalR.IHubContext<MasterHub> Hub { get; internal set; }
//removed for berevity
Hub.Clients.All.SendAsync("method", "data");
Комментарии:
1. Пожалуйста, покажите достаточно кода, чтобы воспроизвести проблему, а не только фрагменты
2. @stuartd я отредактировал его.
3. повезло с этим? Я застрял с той же проблемой
4. @ParasSachapara я переключился на ASP.NET Фреймворк, и это, казалось, устранило проблему. Существуют разные пакеты для .net framework и .net core signalr, убедитесь, что ваш signalr соответствует вашей платформе. Если вы должны использовать .net core, я обнаружил, что можно использовать пакет .net framework signalr с net core framework.