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
'ProgramingTip' 카테고리의 다른 글
목록 항목에서 글 머리 기호와 텍스트 사이의 간격 (0) | 2020.11.27 |
---|---|
WPF TextBlock에 명령을 추가하는 방법은 무엇입니까? (0) | 2020.11.26 |
curl.h 해당 파일 또는 디렉토리 없음 (0) | 2020.11.26 |
옵션이없는 경우 실행하는 방법은 무엇입니까? (0) | 2020.11.26 |
RecyclerView에 EditText 콘텐츠 저장 (0) | 2020.11.26 |