65

SignalRのハブ機能(https://github.com/SignalR/SignalR)を使用して、サブスクライブしているすべてのクライアントにメッセージを公開しています。

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

これは、Javascriptを介して「送信」を呼び出す場合は正常に機能しますが、Webアプリケーションでメッセージを公開することもできます(ASP.NET MVCアクションメソッド内から)。NewsFeedHubで新しいオブジェクトをインスタンス化してSendメソッドを呼び出しようとしましたが、エラーが発生します(ハブの基になる「接続」が設定されていないため)。接続せずにハブを使用する方法はありますか?

4

5 に答える 5

98

この質問が行われてから、SignalRAPIが複数回変更されていることに注意してください。一部の回答が古くなる可能性があります。これは、執筆時点で正しかったので、反対票を投じるべきだという意味ではありません。

SignalR Wikiに見られるように、これに対する別の更新された回答があります

c#

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コンテナーを使用してハブを接続している場合は、コンテナーから取得して、そのconnectionManagerIConnectionManagerを呼び出します。GetHubContext

于 2012-06-19T10:09:30.333 に答える
60

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やバックエンドコードからも簡単に呼び出すことができます。2つの方法により、クライアントで同じイベントが発生します。

于 2015-06-26T00:53:14.700 に答える
10

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!");
 } 
于 2012-04-04T20:41:15.147 に答える
4

私は解決策を探していましたが.NET Core、Googleからここに送られてきましたが、.NET Core解決策については誰も言及していないようです。

ハブ、ここでは何も派手ではありません:

public class MyHub : Hub
{
    // ...
}

あなたの中にcontroller

public class HomeController : Controller
{
    readonly IHubContext<MyHub> _hub;

    public HomeController(IHubContext<MyHub> hub)
    {
        _hub = hub;
    }

    public IActionResult Index()
    {
        // ...
        await _hub.Clients.All.SendAsync("ReceiveMessage", "Hello from HomeController");
        // ...
    }
}
于 2021-02-26T11:00:18.307 に答える
2

DDanの回答に続いて、オーバーロードされた静的メソッドを作成し、共通論理を1つのメソッドに保持できます-私はこのパターンを使用します

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);
于 2017-05-16T09:52:55.987 に答える