spo*_*rts 46 asp.net-mvc asp.net-mvc-4 signalr signalr-hub
如何从控制器的操作中调用hub方法?这样做的正确方法是什么?
有人在帖子中使用过这个:
DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("AdminHub") as AdminHub;
hub.SendMessage("woohoo");
Run Code Online (Sandbox Code Playgroud)
但对我来说,这是投掷:
不支持使用不是由HubPipeline创建的Hub实例.
我还读到你可以创建一个集线器上下文,但我不想对这个动作负责,也就是说,动作做的事情如下:
hubContext.Client(...).someJsMethod(..)
Run Code Online (Sandbox Code Playgroud)
N. *_*len 103
正确的方法是实际创建集线器上下文.您如何以及在何处这取决于您,这里有两种方法:
在您的集线器中创建一个静态方法(不必在您的集线器中,实际上可以在任何地方)然后您可以通过它来调用它 AdminHub.SendMessage("wooo")
Run Code Online (Sandbox Code Playgroud)public static void SendMessage(string msg) { var hubContext = GlobalHost.ConnectionManager.GetHubContext<AdminHub>(); hubContext.Clients.All.foo(msg); }
避免使用静态方法,只需直接发送到集线器客户端即可
Run Code Online (Sandbox Code Playgroud)var hubContext = GlobalHost.ConnectionManager.GetHubContext<AdminHub>(); hubContext.Clients.All.foo(msg);
按照aspnet3.1
这与 ASP.NET 4.x SignalR 不同,后者使用 GlobalHost 提供对 IHubContext 的访问。ASP.NET Core 有一个依赖注入框架,消除了对这个全局单例的需求。
目前建议的方法是通过依赖注入。您可以在这里阅读更多相关内容。
https://learn.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-3.1
上面的片段
public class HomeController : Controller
{
private readonly IHubContext<NotificationHub> _hubContext;
public HomeController(IHubContext<NotificationHub> hubContext)
{
_hubContext = hubContext;
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样称呼它
public async Task<IActionResult> Index()
{
await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}");
return View();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
40373 次 |
最近记录: |