我目前正在尝试RC2发布,ASP.NET Core我遇到了一个问题SignalR.我需要能够在请求线程之外向客户端发送消息.
现在在完整的.NET框架中,您可以这样做:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.<SendMessage>()
Run Code Online (Sandbox Code Playgroud)
但在ASP.NETCore中没有GlobalHost.
我发现了一个类似的问题: 如何在vNext项目中获取SignalR Hub上下文?
第二个答案提供了一种在请求线程之外获取hubcontext的方法,但这也不起作用ASP.NET Core.
所以我的问题是:如何在ASP.NET Core中的请求范围之外获取集线器上下文?
我已经使用新发布的ASP.NET Core 2.1成功设置了SignalR服务器和客户端.我通过ChatHub扩展建立了一个聊天室Hub:每当有来自客户端的消息时,服务器就会通过它将其反弹回来Clients.Others.
我还不了解的是如何向客户端发送消息而不是作为对传入消息的响应.如果服务器正在工作并产生结果,我如何获得访问权限Hub以便向特定客户端发送消息?(或者我甚至需要访问Hub?是否有其他方式发送消息?)
搜索此问题很困难,因为大多数结果来自旧版本的ASP.NET和SignalR.
我正在使用Microsoft.AspNetCore.SignalR(最新版本),并希望从另一个不是的对象中获取集线器上下文Controller.在"完整"SignalR中,我可以使用GlobalHost.ConnectionManager.GetHubContext<MyCoolHub>();
我已经看到很多例子只是Microsoft.AspNetCore.SignalR.IHubContext<MyCoolHub>作为一个参数添加到一个Ctor Controller,但没有例子(那是有效的).
ETA:
所以,这就是我的工作.这个hacky?
public class MyHub : Hub
public static IHubContext<MyHub> GlobalContext { get; private set; }
public MyHub(IHubContext<MyHub> ctx){
GlobalContext = ctx;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我可以这样称呼它:
await MyHub.GlobalContext.Clients.All.InvokeAsync(...)
Run Code Online (Sandbox Code Playgroud) 我正在尝试将SignalR用于Asp Net Core 2.1,以便从控制器方法发送消息,该方法从Angular中的测试按钮触发调用.
我期望的行为是当我单击按钮时,我的服务调用控制器方法,该方法发送测试消息.然后,我将简单地记录消息.
我想在服务中管理它,以避免所有组件中的代码重复.
我已经阅读了一些关于在服务中使用SignalR的问题的例子(我已经使用了第二个解决方案)和本文以及官方文档,但即使应用这些概念它似乎也不起作用.
(所以,或者我绝对是以错误的方式应用它们,或者仍然缺少某些东西,但我找不到...
客户端成功连接到消息中心,如果我单击该按钮,该方法将被点击但我没有收到任何消息,而是在Chrome控制台中收到此警告:
警告:找不到名为"SendAsync"的客户端方法.
发送消息很好,问题就在于接收它们......
问题是:我做错了什么?是后端还是Angular端的错误?
我与你分享我的所有代码(调用控制器方法的按钮和服务是不相关的,因为对服务的调用很顺利):
> Startup.cs
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddSignalR();
}
//...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//...
app.UseSignalR(routes =>
{
//...
routes.MapHub<MessageHub>("/messagehub");
//...
});
}
Run Code Online (Sandbox Code Playgroud)
> MessageHub.cs
public class MessageHub : Hub<ITypedHubClient>
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
public interface ITypedHubClient
{ …Run Code Online (Sandbox Code Playgroud) Microsoft.AspNet.SignalR我一直在尝试在使用库的ASP.NET MVC 项目中使用以下方法:
public interface ITypedHubClient
{
Task BroadcastMessage(string name, string message);
}
Run Code Online (Sandbox Code Playgroud)
继承自集线器:
public class ChatHub : Hub<ITypedHubClient>
{
public void Send(string name, string message)
{
Clients.All.BroadcastMessage(name, message);
}
}
Run Code Online (Sandbox Code Playgroud)
将类型化的 hubcontext 注入到控制器中,并使用它:
public class DemoController : Controller
{
IHubContext<ChatHub, ITypedHubClient> _chatHubContext;
public DemoController(IHubContext<ChatHub, ITypedHubClient> chatHubContext)
{
_chatHubContext = chatHubContext;
}
public IEnumerable<string> Get()
{
_chatHubContext.Clients.All.BroadcastMessage("test", "test");
return new string[] { "value1", "value2" };
}
}
Run Code Online (Sandbox Code Playgroud)
但是,库中没有IHubContext<THub,T>接口Microsoft.AspNet.SignalR,因此我无法使用IHubContext两个参数(IHubContext<ChatHub, ITypedHubClient> _chatHubContext;)。所以,我想知道是否可以使用 DI …
我试图弄清楚如何从服务器上调用强类型集线器上的方法。我正在使用.Net-Core 2.0
我有一个严格键入的集线器接口:
public interface IMessageHub
{
Task Create(Message message);
}
Run Code Online (Sandbox Code Playgroud)
和一个看起来像这样的中心:
public class MessageHub: Hub<IMessageHub>
{
public async Task Create(Message message)
{
await Clients.All.Create(message);
}
}
Run Code Online (Sandbox Code Playgroud)
通常在服务器上,我可能会像这样将内容推送到客户端:
[Route("api/[controller]")]
public MessagesController : Controller
{
IHubContext<MessagesHub> context;
public MessagesController(IHubContext<MessagesHub> context)
{
this.context = context;
}
public Message CreateMessage(Message message)
{
this.context.Clients.All.InvokeAsync("Create", message);
return message;
}
}
Run Code Online (Sandbox Code Playgroud)
如何在静态类型的集线器上调用方法,或者对集线器的工作方式有误解?
public class ComputerHub : Hub
{
private readonly DbContext _db;
public ComputerHub(DbContext db)
{
_db = db;
}
public Task OpenLock(string connectionId)
{
return Clients.Client(connectionId).SendAsync("OpenLock");
}
...
}
Run Code Online (Sandbox Code Playgroud)
启动文件
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
....
app.UseSignalR(routes =>
{
routes.MapHub<ComputerHub>("/computerhub");
});
....
}
Run Code Online (Sandbox Code Playgroud)
我想在控制器中访问 OpenLock 方法。我应该如何将 startup.cs 中的计算机集线器添加到 ServiceCollection。
我正在尝试从 (ASP.NET Core) MVC 控制器调用信号集线器类中的方法,但我无法在网上找到演示如何操作的示例。
注意:有很多示例在 .Net 框架中使用旧版本的信号器,但我看不到任何示例都显示了如何在 .Net Core 中执行此操作。
我需要将 MVC 操作结果中的 id 直接传递到我的集线器,而不是将 id 传递到页面,然后必须将客户端连接返回到集线器。
public class ChatHub : Hub
{
public async Task DoSomething(int id)
{
//// Something in here.
}
}
public class HomeController : Controller
{
private readonly IHubContext<ChatHub> _hubContext;
public HomeController(IHubContext<ChatHub> hubContext)
{
_hubContext = hubContext;
}
public async Task<ActionResult> Index(int id)
{
//// Call the DoSomething method from here, passing the id across.
await _hubContext.Clients.All.SendAsync("AddToGroup", groupId);
}
}
Run Code Online (Sandbox Code Playgroud)
请问有没有办法做到这一点?(或者我是否以错误的方式看待这个问题,是否有更好的方法来实现相同的结果?)
更新:如果我将 Id …
c# signalr signalr-hub asp.net-core-mvc asp.net-core-signalr
我正在尝试在SignalR上调用集线器之外的客户端方法,下面的链接显示了如何在旧版本中执行此操作,尽管我不确定如何在SignalR ASP.NET Core版本中执行此操作.我找到了对旧帖子的引用,并使用了对Microsoft.AspNetCore.SignalR.Infrastructure.IConnectionManager的引用,尽管此命名空间似乎不再存在.一个例子会很棒吗?