시스템의 다른 곳에서 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 단계에 따라 허브 를 쉽게 사용할 수 있습니다.
이와 같은 의존성 주입으로 인스턴스화-
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
'Development Tip' 카테고리의 다른 글
Tortoise SVN : 'theirs'를 사용하여 갈등을 해결합니다. (0) | 2020.10.26 |
---|---|
Jquery는 문자열로 시작하는 모든 ID를 찾으십니까? (0) | 2020.10.26 |
Xcode 4에 사용자 지정 앱 열기 URL 체계를 등록하는 방법은 무엇입니까? (0) | 2020.10.26 |
SVG 요소의 너비 / 높이 가져 오기 (0) | 2020.10.26 |
인덱스 및 객체 유형이 아닌 Pandas DataFrame에서 값을 가져 오는 방법 (0) | 2020.10.26 |