7

これはSignalR+アクションメソッドを介してハブにメッセージを投稿することに関連していますが、私の質問は少し異なります:

ハブを使用して、バージョン0.5.2のSignalerを使用しています。古いバージョンでは、ハブ上にすべてのクライアントにメッセージを送信するメソッドを作成することが推奨されていました。これは私が持っているものです。

public class MyHub : Hub
{
    public void SendMessage(string message)
    {
        // Any other logic here
        Clients.messageRecieved(message);
    }

    ...
}

したがって、0.5.2では、すべてのクライアントにメッセージを送信したいと思います(たとえば、コントローラーのどこかから)。MyHubインスタンスにアクセスするにはどうすればよいですか?

私が参照しているのを見た唯一の方法は次のとおりです。

var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.messageRecieved("hello");

これは問題ありませんが、ハブでメソッドを呼び出したいと思います。

4

3 に答える 3

19

これは、静的メソッドを使用して行うことができます。

SignalR v.04-

public class MyHub : Hub
{
    internal static void SendMessage(string message)
    {
        var connectionManager = (IConnectionManager)AspNetHost.DependencyResolver.GetService(typeof(IConnectionManager));
        dynamic allClients = connectionManager.GetClients<MyHub>();
        allClients.messageRecieved(message);
    }

    ...
}

SignalR 0.5+

public class MyHub : Hub
{
    internal static void SendMessage(string message)
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        context.Clients.messageRecieved(message);
    }

    ...
}

次に、これを次のように呼び出すことができます。

MyHub.SendMessage("The Message!");

SignalR APIに関する優れた記事:http ://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx

コメントでパオロモレッティによって提供

于 2012-07-13T15:37:49.040 に答える
4

同じ問題がありました。私の例では、addNotificationはクライアント側のメソッドです。

var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>();
hubContext.Clients.addNotification("Text here");

クライアント側では、addNotificationでハブメソッドを呼び出すコードを追加できます。

var notification = $.connection.notificationHub;
notification.addNotification = function (message) {
 notification.addServerNotification(message); // Server Side method
}

$.connection.hub.start();

ハブ:

 [HubName("notificationHub")]
    public class NotificationsHub : Hub
    {
        public void addServerNotification(string message)
        {
          //do your thing
        }
    }

更新:あなたの質問を何度も何度も読んで、私は本当にそれをする理由を見つけません。ハブメソッドは通常、クライアント側から呼び出されるためにあります。または、私はあなたを誤解しましたが、とにかくここに更新があります。サーバー側のことを実行してからクライアントに通知する場合。

  [HttpPost]
  [Authorize]
  public ActionResult Add(Item item)
  {
      MyHubMethodCopy(item);
      var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>();
    hubContext.Clients.addNotification("Items were added");

  }

  private void MyHubMethodCopy(Item item)
  {
      itemService.AddItem(item);
  }
于 2012-07-13T15:44:07.250 に答える
2

ASP.NET Core 2.xおよび3.xの更新:

依存性注入がある場所ならどこからでもハブインスタンスに簡単にアクセスできます。

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

    public HomeController(IHubContext<MyHub> myHubContext)
    {
        _myHubContext = myHubContext;
    }

    public void SendMessage(string msg)
    {
        _myHubContext.Clients.All.SendAsync("MessageFromServer", msg);
    }
}

構文エラーが発生する場合は、次のことを確認してください。

using Microsoft.AspNetCore.SignalR;

そしてあなたが持っていないこと:

using Microsoft.AspNet.SignalR;
于 2020-07-11T03:25:17.983 に答える