SignalR работает только при первом вызове

#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.