Вызов метода Signalr из контроллера .Net Core 2.1 - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь вызвать метод в классе-концентраторе signalr из контроллера (ASP.NET Core) MVC, но не могу найти в Интернете пример, показывающий, как это сделать.

Примечание.Есть много примеров использования старых версий сигнализатора с .Net Framework, но ни один из них, который я вижу, не показывает, как это сделать в .Net Core.

Мне нужно передать идентификатор изРезультат действия MVC напрямую через мой концентратор, не передавая идентификатор на страницу, а затем возвращая клиентское соединение через концентратор.

public class ChatHub : Hub
{ 
    public async Task DoSomething(int id)
    {            
        //// Something in here.
    }
}



public class HomeController : Controller
{
    private readonly IHubContext<ChatHub> _hubContext;

    public HomeController(IHubContext<ChatHub> hubContext)
    {
        _hubContext = hubContext;
    }

    public async Task<ActionResult> Index(int id) 
    {

         //// Call the DoSomething method from here, passing the id across.
         await _hubContext.Clients.All.SendAsync("AddToGroup", groupId);
    }
}

Есть ли способ сделать это, пожалуйста?(Или я смотрю на это неправильно, и есть ли лучший способ достичь того же результата?)

Обновление: Если я передам Id в представление, а затем используюJavaScript для вызова Hub, затем вызывается метод DoSomething, так что я вижу, что все правильно висит, но не при попытке вызвать его в C #.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Похоже, вам нужен хаб с типом строчной буквы , который позволит вызывать методы-концентраторы из контроллера, вот базовый пример кода по ссылке выше (адаптированной к вашему коду):

public class ChatHub : Hub<IChatHub>
{
    public async Task DoSomething(int id)
    {
        // 
    }
}

public interface IChatHub
{
    Task DoSomething(int id);
}

Это позволит вам затем позвонить на IHubContext следующим образом:

public class HomeController : Controller
{
    private readonly IHubContext<ChatHub, IChatHub> _hubContext;

    public HomeController(IHubContext<ChatHub, IChatHub> hubContext)
    {
        _hubContext = hubContext;
    }

    public async Task<ActionResult> Index(int id) 
    {
         await _hubContext.Clients.All.DoSomething(id);
    }
}

Надеюсь, это поможет вам.

0 голосов
/ 30 октября 2018

Я думаю, что вы не понимаете, как все это работает вместе (это то же самое, что я делал до вчерашнего дня), код хаба для кода скрипта на стороне клиента для обратного вызова, а затем действия, тогда как IHubContextиспользуется как строго типизированные методы, которые будут отправлены на клиентскую сторону

Концентратор

// This class is used by the JavaScript Client to call into the .net core application.
public class ChatHub : Hub<IChatClient>
{

    public static ConcurrentDictionary<string, string> Connections = new ConcurrentDictionary<string, string>();

    // As an example, On connection save the user name with a link to the client Id for later user callback
    public override Task OnConnectedAsync()
    {
        var user = Context.User.Identity.Name;

        Connections.AddOrUpdate(this.Context.ConnectionId, user, (key, oldValue) => user);

        return base.OnConnectedAsync();
    }

    public override Task OnDisconnectedAsync(Exception exception)
    {
        // Do something on disconnect.
    }

    // Add other methods you want to be able to call from JavaScript side in here...
    public void SendMessage(int id, string message)
    {
        // Message doing stuff here.
    }
}

Интерфейс ChatClient

// This provides strongly-typed methods that you'll have on the Client side but these don't exist on the server.
public interface IChatClient
{
    //So this method is a JS one not a .net one and will be called on the client(s)
    Task DoSomething(int id);

    Task NotificationUpdate(int id, string message);
}

Контроллер

public class HomeController : Controller
{
    private readonly IHubContext<ChatHub, IChatClient> _hubContext;

    public HomeController(IHubContext<ChatHub, IChatClient> hubContext)
    {
        _hubContext = hubContext;
    }

    public async Task<ActionResult> Index(int id) 
    {

         // This calls the method on the Client-side
         await _hubContext.Clients.All.DoSomething(id);
    }
}
0 голосов
/ 09 октября 2018

Вы можете использовать IHubContext для этого:

public class HomeController : Controller
{
    private readonly IHubContext<ChatHub> _hubContext;

    public HomeController(IHubContext<ChatHub> hubContext)
    {
        _hubContext = hubContext;
    }

    public async Task<ActionResult> Index(int id) 
    {
         //// Call the DoSomething method from here, passing the id across.
         await _hubContext.Clients.All.SendAsync("DoSomething", id);
    }
}

Полные документы и примеры здесь.

...