ProgramingTip

SignalR + 작업 방법을 통해 허브에 메시지 게시

bestdevel 2020. 11. 26. 19:43
반응형

SignalR + 작업 방법을 통해 허브에 메시지 게시


SignalR의 허브 기능 ( https://github.com/SignalR/SignalR )을 사용하여 구독 한 모든 클라이언트에 메시지를 게시하고 있습니다.

public class NewsFeedHub : Hub
public void Send(string channel, string content)
{
    Clients[channel].addMessage(content);
}

이 Javascript를 통해 "Send"를 호출 할 때 잘 작동하지만 웹 응용 프로그램이 메시지를 게시하고 싶습니다 (ASP.NET MVC 작업 메서드 내에서). 이미 새 개체 ob NewsFeedHub를 인스턴스화하고 메서드를 호출하려고 시도했지만 이로 인해 오류가 발생합니다 (허브의 기본 "연결"이 설정되지 않았 음). 연결없이 허브를 사용할 수있는 방법이 있나요?


이 질문을받은 이후 SignalR API는 여러 번 변경되었습니다. 일부 답변이 구식이 될 가능성이 있습니다. 이것은 글을 쓰는 시점에 맞았 기 때문에 반대표를한다는 의미는 아닙니다.

SignalR Wiki 에서 볼 수 있음 이에 대한 또 다른 업데이트 된 답변이 있습니다.

씨 #

Public ActionResult MyControllerMethod()
{
    var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
    context.Clients.All.methodInJavascript("hello world");
    // or
    context.Clients.Group("groupname").methodInJavascript("hello world");
}

vb.net

Public Function MyControllerMethod() As ActionResult
    Dim context = GlobalHost.ConnectionManager.GetHubContext(Of MyHub)()
    context.Clients.All.methodInJavascript("hello world")
    '' or
    context.Clients.Group("groupname").methodInJavascript("hello world")
End Function

최신 정보

이 코드는 업데이트되었습니다. 따라 http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server을 변경.

DI 컨테이너를 사용하는 경우

DI 컨테이너를 사용하여 허브 를 연결하는 경우 IConnectionManager컨테이너에서 가져 오는 GetHubContext해당 connectionManager를 호출하십시오 .


2018 년 2 월, 짧고 간단한 솔루션

이 문제를 해결하기 위해 일반적으로 다음과 같은 방식으로 허브를 디자인합니다.

public class NewsFeedHub : Hub 
{
    private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<NewsFeedHub>();

    // Call this from JS: hub.client.send(channel, content)
    public void Send(string channel, string content)
    {
        Clients.Group(channel).addMessage(content);
    }

    // Call this from C#: NewsFeedHub.Static_Send(channel, content)
    public static void Static_Send(string channel, string content)
    {
        hubContext.Clients.Group(channel).addMessage(content);
    }

}

따라서 Javascript 및 백엔드 코드에서 쉽게 호출 할 수 있습니다. 두 메서드는 클라이언트에서 동일한 이벤트를 발생합니다.


업데이트 2012 : 이 답변도 오래되었습니다! SignalR의 공용 API는 실시간으로 유동적입니다. Tim B James는 2012 년 7 월 현재 새롭고 적절한 API 사용을 보유하고 있습니다.

업데이트 2019 더 이상이 답변을 사용하지 않습니다. AspNetCore에서 작동하는 SignalR의 새 버전은 Tim B James가 수락 한 답변 또는 기타 찬성 답변을 참조해야합니다. 나는 역사를 위해 대답을 여기에두고있다.


Mike의 현재 승인 된 답변은 오래 지원 더 이상 최신 버전의 SignalR에서 작동하지 않습니다.

다음은 MVC 컨트롤러 작업에서 허브에 메시지를 게시하는 방법을 업데이트 된 버전입니다.

public ActionResult MyControllerMethod() 
{
     // Important: .Resolve is an extension method inside SignalR.Infrastructure namespace.
     var connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
     var clients = connectionManager.GetClients<MyHub>();

     // Broadcast to all clients.
     clients.MethodOnTheJavascript("Good news!");

     // Broadcast only to clients in a group.
     clients["someGroupName"].MethodOnTheJavascript("Hello, some group!");

     // Broadcast only to a particular client.
     clients["someConnectionId"].MethodOnTheJavascript("Hello, particular client!");
 } 

DDan의 답변에 따라 오버로드 된 정적 메서드를 생성 하나의 메서드에 논리를 사용합니다.

public class ChatHub : Hub
{
    private static IHubConnectionContext<dynamic> GetClients(ChatHub chatHub)
    {
        if (chatHub == null)
            return GlobalHost.ConnectionManager.GetHubContext<ChatHub>().Clients;
        else
            return chatHub.Clients;
    }

    // Call from JavaScript
    public void Send(string message)
    {
        Send(message, this);
    }

    // Call from C# eg: Hubs.ChatHub.Send(message, null);
    public static void Send(string message, ChatHub chatHub)
    {
        IHubConnectionContext<dynamic> clients = GetClients(chatHub);
        // common logic goes here 
        clients.All.receiveSend(message);
    }
}

그런 다음 컨트롤러에서 사용할 수 있습니다.

Hubs.ChatHub.Send(arg1, null);

참고URL : https://stackoverflow.com/questions/7549179/signalr-posting-a-message-to-a-hub-via-an-action-method

반응형