Hubpipleline 외부에서 SignalR 허브 인스턴스를 사용하는 방법


81

SignalR을 사용하여 모든 클라이언트에게 메시지를 브로드 캐스트하고 있습니다. 내 허브 클래스 외부, 즉 아래와 같은 방송을 트리거해야합니다.

var broadcast = new chatHub(); broadcast.Send("Admin","stop the chat");

다음과 같은 오류 메시지가 나타납니다.

HubPipeline에 의해 생성되지 않은 허브 인스턴스 사용은 지원되지 않습니다.

답변:


140

다음을 사용해야합니다 GetHubContext.

var context = GlobalHost.ConnectionManager.GetHubContext<chatHub>();
context.Clients.All.Send("Admin", "stop the chat");

이에 대해서는 http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub에 자세히 설명되어 있습니다 .


4
"context.Clients.All.Send"는 호출자에게 다시 브로드 캐스트되지 않고 다른 사용자에게만 브로드 캐스트됩니다. 어떤 아이디어?
user384080 dec.

4
사용중인 경우 GetHubContext허브 외부에서 사용하기위한 것이므로 호출자가 없습니다. Clients.All현재 허브에 연결된 모든 클라이언트를 처리해야합니다.
halter73 dec

5
동일한 코드가 있지만 Send 메서드 또는 다른 메서드가 호출되지 않습니다.
nAviD

5
이것은 허브의 인스턴스를 얻는 것이 아니라 IHubContext. 허브 메서드를 호출하는 데 사용할 수 없습니다.
George Mauer

4
이것은 한 가지 변경으로 나를 위해 일했습니다 context.Clients.All.broadcastMessage("Admin", "stop the chat"); . 보내기 대신 broadcastMessage를 사용하십시오.
Wheel Builder

4

GlobalHost가 어디로 갔는지 궁금해하는 사람들을위한 작은 업데이트입니다 . SignalR은 .net 코어 용으로 완전히 다시 작성되었습니다. 따라서 SignalR.Core 패키지 ( SignalR 버전 간 차이 )를 사용하는 경우 서비스에 삽입하여 SignalR 허브 컨텍스트의 인스턴스를 가져옵니다.

public class MyNeedyService
{
    private readonly IHubContext<MyHub> ctx;

    public MyNeedyService(IHubContext<MyHub> ctx)
    {
        this.ctx = ctx;
    }

    public async Task MyMethod()
    {
        await this.ctx.All.SendAsync("clientCall");
    }
}

그리고 Startup.cs:

services.AddSignalR()/*.AddAzureSignalR("...")*/;

Microsoft 문서는 다음과 같습니다 . 허브 외부에서 SignalR 메시지 보내기 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.