Development Tip

시스템의 다른 곳에서 SignalR 허브 클라이언트 호출

yourdevel 2020. 10. 26. 21:23
반응형

시스템의 다른 곳에서 SignalR 허브 클라이언트 호출


서버와 클라이언트간에 통신하도록 SignalR 허브를 설정했습니다. 허브 서버 측 코드는 Hooking.cs라는 클래스에 저장됩니다. 내가 원하는 것은 Hooking.cs에 정의 된 메서드를 호출하여 애플리케이션의 어느 곳에서나 연결된 클라이언트에게 메시지를 브로드 캐스트 할 수 있도록하는 것입니다. 모든 클라이언트 / 서버 호출에 대해 Hooking.cs의 새 인스턴스가 생성 된 것 같아서 다음과 같은 것을 사용할 수 있기를 바랐습니다.

var hooking = new Hooking();
hooking.Test();

다음과 같은 Hooking.cs에 정의 된 Test () 메서드를 사용하여

public static void Test() {
    Clients.test()
}

그리고 클라이언트 측 자바 스크립트

var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()

불행히도 클라이언트는 정적이 아니므로 정적 메서드에서 액세스 할 수 없기 때문에 그렇게 간단하지 않습니다.

SignalR 소스 코드를 살펴보면서 유망 해 보이는 방법을 발견했습니다 Hubs.Invoke(string hubName, string method, params object[] args). 그래서 다음과 같은 것을 사용할 수 있기를 바라지 Hubs.Invoke("Hooking", "Test")만 작동하게 만들 수는 없습니다.

이것에 대한 도움을 주시면 대단히 감사하겠습니다.


이것은 SignalR 2.x의 올바른 방법입니다.

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(message);

기본적으로 현재 호스트에 대한 종속성 확인자를 사용하여 IConnectionManager허브에 대한 컨텍스트 개체를 확보 할 수 있는 인터페이스를 확인할 수 있습니다.

자세한 정보는 공식 문서 에서 찾을 수 있습니다 .


Hub.GetClients는 버전 0.4.0에서 사라졌습니다.

로부터 위키 당신은 지금 사용할 수 있습니다 :

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();

이 2 단계에 따라 허브쉽게 사용할 수 있습니다.

  1. 이와 같은 의존성 주입으로 인스턴스화-

    public class ClassName
    {
        ........
        ........
        private IHubContext _hub;
    
        public BulletinSenderController(IConnectionManager connectionManager)
        {
            _hub = connectionManager.GetHubContext<McpHub>();
            ........
            ........
        }
    
        ............
        ............
    }
    

2.이 hub같은 개체 사용-

_hub.Clients.All.onBulletinSent(bulletinToSend);

자세한 내용은 여기에서 확인할 수 있습니다 .

예제 코드는 이 git repo에서 찾을 수 있습니다 .


이에 어떻게하는지 살펴 되세요 Chat.cs에서 SignalR.Samples.Hubs.Chat에서 https://github.com/SignalR/SignalR을 .

나는 거기에서 static Dictionary<TKey, TValue>가 맨 위에 인스턴스화되고 있음을 볼 수 있으므로 Chat클래스가 지속 형 인스턴스 (?)이거나 그 배열이 어떻게 든 업데이트되는 등 지속적으로 유지되고 있다고 상상 합니다.

확인해보세요. David Fowler가 아마도 이것에 대해 최고 일 것입니다.


.NET Core 2에서 변경되었으므로 이제 다음과 같이 종속성 주입을 사용할 수 있습니다.

    private readonly IHubContext<MyHub,IMyHubInterface> _hubContext;

    public MyController(MyHub,IMyHubInterface hubContext)
    {
        _hubContext = hubContext;
    }

    public bool SendViaSignalR()
    {
        _hubContext.Clients.All.MyClientSideSignalRMethod(new MyModel());
        return true;
    }

참고 URL : https://stackoverflow.com/questions/7634255/calling-signalr-hub-clients-from-elsewhere-in-system

반응형