天道酬勤,学无止境

In ASP.NET Core SignalR, how do I send a message from the server to a client?

I've successfully setup a SignalR server and client using the newly released ASP.NET Core 2.1. I built a chat room by making my ChatHub extend Hub: whenever a message comes in from a client, the server blasts it back out via Clients.Others.

What I do not yet understand is how to send a message to clients not as a response to an incoming message. If the server is doing work and produces a result, how do I gain access to the Hub in order to message particular clients? (Or do I even need access to the Hub? Is there another way to send messages?)

Searching this issue is difficult as most results come from old versions of ASP.NET and SignalR.

评论

You can inject the IHubContext<T> class into a service and call the clients using that.

public class NotifyService
{
    private readonly IHubContext<ChatHub> _hub;

    public NotifyService(IHubContext<ChatHub> hub)
    {
        _hub = hub;
    }

    public Task SendNotificationAsync(string message)
    {
        return _hub.Clients.All.InvokeAsync("ReceiveMessage", message);
    }
}

Now you can inject the NotifyService into your class and send messages to all clients:

public class SomeClass
{
    private readonly NotifyService _service;

    public SomeClass(NotifyService service)
    {
        _service = service;
    }

    public Task Send(string message)
    {
        return _service.SendNotificationAsync(message);
    }
}

Simple inject the hubcontext into the class where you use the hubcontext.

Details you will find there:

Call SignalR Core Hub method from Controller

There are now official Microsoft Docs for the SignalR HubContext that answer your question https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-2.1

But yes, as others have pointed out, you need to get an instance of IHubContext via dependency injection to access hub methods outside of the hub.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在ASP.NET Core中获取SignalR Hub上下文?(How to get SignalR Hub Context in a ASP.NET Core?)
    问题 我正在尝试使用以下命令获取中心的上下文: var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>(); 问题是没有定义GlobalHost。 我看到它是SignalR.Core dll的一部分。 目前,我在项目.json文件中的依赖项中包含以下内容: "Microsoft.AspNet.SignalR.Server": "3.0.0-*" 如果我添加Core的最新可用版本: "Microsoft.AspNet.SignalR.Server": "3.0.0-*", "Microsoft.AspNet.SignalR.Core" : "2.1.2" 我收到很多错误,因为服务器和核心冲突。 如果我将它们都更改为都使用版本“ 3.0.0- *”,则所有冲突都将消失,但是找不到GlobalHost。 如果我删除服务器,而仅使用用户核心版本2.1.2,则GlobalHost可以工作,但是所有其他需要服务器的东西显然都不能。 有任何想法吗? 回答1 Microsoft.AspNet.SignalR.Infrastructure.IConnectionManager是一种DI注入服务,通过它可以获取集线器上下文...例如: using Microsoft.AspNet.SignalR; using
  • 请求线程外的ASP.NET Core RC2 SignalR集线器上下文(ASP.NET Core RC2 SignalR Hub Context outside request thread)
    问题 我目前正在尝试ASP.NET Core的RC2版本,并且遇到SignalR的问题。 我需要能够将消息发送到请求线程之外的客户端。 现在,在完整的.NET框架中,您可以像这样进行操作: var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); context.Clients.<SendMessage>() 但是在ASP.NET Core中没有GlobalHost 。 我发现了一个类似的问题:如何在vNext项目中获取SignalR Hub上下文? 第二个答案提供了一种在请求线程之外获取hubcontext的方法,但这在ASP.NET Core也不起作用。 所以我的问题是:如何在ASP.NET Core的请求范围之外获取集线器上下文? 回答1 您将必须从:Signalr Github中获取当前的github版本(在撰写本文时,提交: b95ac7b ) 一旦有了它,并加载了解决方案,或将所有三个项目添加到现有解决方案中,您将需要在所有三个项目中更改project.json。 Microsoft.AspNetCore.SignalR.Server-project.json 您将看到每个组件的版本1.1.0- *(RC3)的引用。 将它们更改为当前的RC2,直到看到以下内容 "Microsoft
  • SignalR无法读取未定义的属性客户端(SignalR cannot read property client of undefined)
    问题 我正在尝试将SignalR添加到我的项目(ASPNET MVC 4)中。 但是我不能使它工作。 在下图中,您可以看到我收到的错误。 我已经阅读了很多stackoverflow帖子,但是都没有解决我的问题。 这是我到目前为止所做的: 1) Ran Install-Package Microsoft.AspNet.SignalR -Pre 2) Added RouteTable.Routes.MapHubs(); in Global.asax.cs Application_Start() 3) If I go to http://localhost:9096/Gdp.IServer.Web/signalr/hubs I can see the file content 4) Added <modules runAllManagedModulesForAllRequests="true"/> to Web.Config 5) Created folder Hubs in the root of the MVC application 6) Moved jquery and signalR scripts to /Scripts/lib folder (I'm not using jquery 1.6.4, I'm using the latest) 这是我的Index.cshtml
  • 使用SignalR将数据从SQL Server推送到Web应用程序(Pushing data from SQL Server to Web Application with SignalR)
    问题 我的ASP.NET MVC 4 Web应用程序正在向客户端显示频繁更新的数据。 数据源自外部源(服务器上安装的应用程序),并由SQL Server 2008 R2处理。 当前,数据流非常传统:客户端从ASP.NET进行轮询,而ASP.NET从SQL Server依次进行轮询。 为了避免轮询(并且现在我需要Web应用程序的用户之间进行实时交互),我改变了推送方法,使用signalR向客户端广播数据。 这样可以提高用户体验的流畅度,还可以减少客户端和ASP.NET服务器之间轮询的开销。 现在的问题是颠倒了SSRV和ASP.NET之间的流程:我想以最有效的方式将数据从SSRV推送到ASP.NET 。 SSRV正在运行昂贵的查询以导入一些外部数据-处理完数据后,它们也准备好通过广播在Internet上共享。 我当前的穷人方法:向Web应用程序(在localhost上)发出POST Http请求以发送数据(我正在为此使用CLR函数)。 处理完数据后,我将它们打包以准备HttpWebRequest ,并在Service Broker中将它们排队,以免影响其他活动,然后就完成了。 我已经注销了SqlDependency因为这将迫使我查询数据-并不是一个很大的优势(我将折衷使用localhost HTTP请求来查询在SQL Server上运行的查询) 同时
  • 在Typescript中使用ASP.NET Core SignalR和React创建实时应用程序
    目录 介绍 ScrumPoker应用程序 源代码 开发工具 基本步骤 后端代码 创建Hub 在Startup中注册集线器 创建持久性 让我们为客户端应用程序公开一些终端 启用Cors 前端代码 结论 SignalR现在包含在ASP.NET Core框架中,并且进行了大量改进,使其轻巧易用。令我惊讶的是,我找不到任何有关如何使用SignalR的好教程,并且无法使用它使相同的旧聊天应用程序变得有趣。我想到了用SignalR创建一些东西,而不是同一个无聊的聊天应用程序。 介绍 在本教程中,我将指导您完成创建实时应用程序所需的主要步骤。我不会在这里写完整的代码。您可以在github 上找到完整的源代码。 ScrumPoker应用程序 在本教程中,我们将创建一个有趣的应用程序,名为ScrumPoker。我们生活在敏捷的世界中,因此在我们的开发过程或每个冲刺周期中进行故事评估并指出要点很普遍。过去,我们曾经计划使用扑克牌,而团队则通过这些牌来进行故事评估,但是现在一切都在线上了,我们经常进行远程工作。 用户可以创建ScrumBoard链接并与队友共享链接。团队成员可以进入那里并开始指出故事。只有当创建的用户ScrumBoard允许他们查看时,团队给出的点才会显示在仪表板上。 用户会实时添加到仪表板上,他们提交的点也会实时反映出来。 源代码 ├───clientapp├───Contracts├
  • SignalR应用程序无法在IIS下运行(SignalR applications do not work under IIS)
    问题 我试图在Visual Studio 2012中构建SignalR应用程序。我的问题是,它在Visual Studio调试下(在Windows 7上使用Visual Studio 2012)运行良好,但是当我尝试在Windows Server 2012上的IIS 8上部署该应用程序时,该应用程序只显示了index.html页面。 我决定尝试缩小问题范围,无论是在我的代码中还是在SignalR中。 我编译了http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr中显示的SignalR教程。 在Visual Studio上这可以正常工作,但是除了在IIS下显示静态页面外,它不会做任何其他事情。 我尝试了这里列出的一些方法:Signalr / Hub在IIS 7中未加载,但在Visual Studio中正常运行,但似乎都无法正常工作。 回答1 假设您实际上想要查看index.html (即您的问题不是“显示的是空的index.html而不是我的聊天页面chat.html”),那么听起来就像当您在聊天页面中输入内容时,并不是在连接到该聊天的其他浏览器窗口中显示为聊天。 我会尝试一些基本测试。 我将假设: 在服务器上安装并配置了ASP.NET(如果没有,请参见脚注)
  • 如何在Android中使用Signalr(How to use signalr in Android)
    问题 我正在尝试将signalR集成到android应用中,但是没有运气。 我一直在研究各种链接,但没有一个提供有关实现的适当信息。 我有以下问题。 SignalR集成必须在服务/意图服务内部完成吗? 如果我们想通过相同的调用方法接收响应,那么如何获得? 我添加了三个库,即signalr android , signalr client和gson但无法理解代码的工作原理,没有适当的文档可用来理解代码。 提出了一些问题,但没有太多信息 Android Studio中的SignalR无法使用Android中的SignalR实现p2p聊天 如果有人对本机应用程序的信号处理有经验,那对我会非常有帮助。 更新 public class SignalRService extends Service { private static final String TAG = "Service"; private HubConnection mHubConnection; private HubProxy mHubProxy; private Handler mHandler; // to display Toast message private final IBinder mBinder = new LocalBinder(); private SharedPreferences sp;
  • 使用SignalR的WCF服务(WCF Service with SignalR)
    问题 我有一个Web应用程序,其仪表板上的图表很少。 图表的数据在客户端调用WCF服务方法的document.ready函数上获取。 我现在想要的是在我的应用程序中使用SignalR。 我真的是SignalR的新手。 我如何从SignalR Hub调用WCF方法,或者您能说的是,与其从服务器提取数据,我不希望WCF服务每隔一分钟将数据推送到客户端。 signalR和WCF服务之间是否有通信方式。 另一种方法可以是强制客户端每分钟从WCF服务请求数据。 任何帮助将不胜感激。 到目前为止,我已经完成了以下工作。 我的仪表板页面上的客户端功能 <script src="Scripts/jquery.signalR-2.0.3.min.js"></script> <!--Reference the autogenerated SignalR hub script. --> <script src="/signalr/hubs"></script> <a id="refresh">Refresh</a> $(function() { var dashboardHubProxy = $.connection.dashboardHub; $.connection.hub.start().done(function() { // dashboardHubProxy.server
  • 可以用SignalR流式传输视频吗?(it is possible to stream video with SignalR?)
    问题 好吧,我正在尝试提供有关视频流的证明,我正在使用asp.net c#。 我有点迷茫,您有什么想法或建议吗? 回答1 不,SignalR基于标准(WebSocket,LongPolling,ForeverFrame等),这些标准仅流式传输基于文本的JSON消息。 您最好研究一下WebRTC规范。 现在,您可以通过使用SignalR发送控制消息来触发这两种JavaScript,从而更改浏览器当前显示的WebRTC提要,从而将这两种技术结合在一起。 回答2 我在SignalR之上实现了视频流。 您可以在http://weblogs.asp.net/ricardoperes/archive/2014/04/24/video-streaming-with-asp-net-signalr-and-html5.aspx中找到我的示例。 回答3 我不知道SignalR是否打算用于视频流,但是SignalR是客户端到客户端,客户端到服务器和服务器到客户端之间的集线器容器。 如果我想进行视频聊天,为什么不能将其用作我的集线器? 无论如何,SignalR也可以处理字节数组,不仅可以处理字符串,还可以通过将每个帧作为byte [](流)发送来进行尝试。 至少当我仅使用.Net时,我可以使用hub [[]]。 当我放入Python时,我需要使用base64序列化为字符串,并且它也可以通过我的PI运行。
  • 如何在中心线之外使用SignalR集线器实例(How to use SignalR hub instance outside of the hubpipleline)
    问题 我正在使用SignalR向所有客户广播消息。 我需要在集线器类之外触发广播,例如以下内容: var broadcast = new chatHub(); broadcast.Send("Admin","stop the chat"); 我收到以下错误消息: 不支持使用不是由HubPipeline创建的Hub实例。 回答1 您需要使用GetHubContext : var context = GlobalHost.ConnectionManager.GetHubContext<chatHub>(); context.Clients.All.Send("Admin", "stop the chat"); 有关详细信息,请参见http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromouthub。 回答2 对于那些可能想知道GlobalHost去哪里的人的一个小更新。 SignalR已针对.net核心进行了完全重写。 因此,如果您使用SignalR.Core包(SignalR版本之间的差异),则可以通过将SignalR集线器上下文注入服务中来获得一个实例: public class MyNeedyService { private readonly
  • SignalR Console应用程序示例(SignalR Console app example)
    问题 是否有一个使用signalR将消息发送到.net集线器的控制台或winform应用程序的小示例? 我尝试了.net示例,并查看了Wiki,但对我而言,集线器(.net)和客户端(控制台应用程序)之间的关系没有意义(找不到此类示例)。 该应用程序是否仅需要连接集线器的地址和名称? 是否有人可以提供一小段代码来显示应用程序连接到集线器并发送“ Hello World”或.net集线器收到的内容? PS。 我有一个标准的中心聊天示例,该示例很好用,如果我尝试在Cs中为其指定中心名称,它将停止工作,即[HubName(“ test”)],您知道原因吗? 谢谢。 当前控制台应用程序代码。 static void Main(string[] args) { //Set connection var connection = new HubConnection("http://localhost:41627/"); //Make proxy to hub based on hub name on server var myHub = connection.CreateProxy("chat"); //Start connection connection.Start().ContinueWith(task => { if (task.IsFaulted) { Console
  • How to use shared SignalR Hub from different hosted project in ASP.NET Core 2.2
    I'm working with a project built with ASP.NET Core 2.2. The main solution contains multiple projects, which includes API, web and other class libraries. We've used SignalR to displaying shared messages/notifications between the API project and the web project. For example, adding a new employee record from an API should call SignalR Hub and all the web client should received the notification. Here is the current structure of our project |- API |- Hub_ClassLibrary |- Services |- Web Flow: Web > services > Hub API > services > Hub Hub: public class NotificationHub : Hub { public async Task
  • ASP.NET Core RC2 SignalR Hub Context outside request thread
    I am currently trying out the RC2 release of ASP.NET Core and I am running into an issue with SignalR. I need to be able to send messages to the client outside of the request thread. Now in the full .NET framework you can do this like: var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); context.Clients.<SendMessage>() But in ASP.NET Core there is no GlobalHost. I found a similar question: How to get SignalR Hub Context in a vNext Project? Where the second answer provides a method to get the hubcontext outside the request thread, but this also does not work in ASP.NET Core. So my
  • 如何使用SignalR保证消息传递?(How to do guaranteed message delivery with SignalR?)
    问题 我正在使用C#和SignalR开发实时客户端-服务器应用程序。 我需要尽快将消息发送给客户端。 我在服务器上的代码: for (int i = 0; i < totalRecords; i++) { hubContext.Clients.Client(clientList[c].Key).addMessage( serverId, RecordsList[i].type + RecordsList[i].value); Thread.Sleep(50); } 如果延迟> = 50毫秒,则一切正常,但是如果没有延迟或延迟小于50毫秒,则会丢失某些消息。 我需要尽快发送消息,不要拖延。 我想我需要检查是否已收到消息,并且仅在发送另一条消息之后才能检查。 如何以正确的方式做到这一点? 回答1 SignalR不保证消息传递。 由于SignalR在您调用客户端方法时不会阻塞,因此,您可以很快发现所调用的客户端方法。 不幸的是,一旦您发送了消息,客户端可能并不总是准备立即接收消息,因此SignalR必须缓冲消息。 一般来说,SignalR将为每个客户端最多缓冲1000条消息。 一旦客户端落后了1000条以上的消息,它将开始丢失消息。 可以将DefaultMessageBufferSize设置为1000,但可以增加SignalR的内存使用量,但仍不能保证消息的传递。 http://www
  • 如何获得SignalR集线器连接以跨域工作?(How do I get a SignalR hub connection to work cross-domain?)
    问题 我试图获得一个超级简单的集线器连接,可以跨域工作,但是没有运气。 我已经阅读了数十篇文章,并做了提及的所有内容,但仍然没有成功。 我的服务器中心在这里 public class ChatHub : Hub { public void Send(string name, string message) { Clients.All.broadcastMessage(name, message); } } 我的服务器MapHubs呼叫在这里 RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true }); 我的任何JavaScript客户端都在这里 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <script src="~/Scripts/jquery-2.0.1.min.js"></script> <script src="~/Scripts/jquery.signalR-1.1.2.min.js"></script> <script src="/signalr/hubs"></script> </head> <body>
  • How to buffer messages on signal hub and send them when the right client appears?
    I hawe two type of clients connecting my signalR server (ASP.NET Core). Some of them are senders, and some of them are receivers. I need to route messages from senders to the receivers, which is not a problem, but when there is no receivers, I need to somehow buffer messages and not lose them (probably the best is ConcurrentQueue in some kind of a singleton class) but when the first receiver connect, the message buffer needs to start dequeue. Which is the best approach for this? I created singleton class that wraps arround ConcurrentQueue collection and I enqueue and dequeue messages there
  • 从WebAPI控制器问题调用SignalR集线器(calling SignalR hub from WebAPI controller issues)
    问题 我无法弄清楚如何从WebAPI ApiController调用SignalR集线器。 我整理了一个样本,您可以在此处下载该样本,以简化问题并演示问题。 我从ASP.NET MVC WebAPI模板创建了一个新项目。 我向该项目添加了一个新的SignalR Hub,名为ChatHub。 添加了一个HTML页面,该页面在加载时连接到ChatHub,加入一个组并向该组发送消息。 这很好用。 HTML页面还具有一个按钮,单击该按钮将触发对ValuesController的post方法的ajax调用。 在ValuesController的post方法中,我想向组中所有连接的客户端广播消息。 我无法使它正常工作。 我有一个仅使用2种方法的简单SignalR集线器。 [HubName("chat")] public class ChatHub : Hub { public void Join(string room) { // NOTE: this is not persisted - .... Groups.Add(Context.ConnectionId, room); } public void Send(string room, string message) { var msg = String.Format( "{0}: {1}", Context.ConnectionId
  • ASP.Net MVC中长时间运行的服务器调用的进度条(Progress bar for long running server calls in ASP.Net MVC [closed])
    问题 关闭。 这个问题需要调试细节。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 2年前关闭。 改善这个问题 我只想在长时间运行服务器调用时创建一个进度条。 控制器执行长时间运行的工作时,无法向控制器创建ajax发布请求。 我想要创建一个其他操作来获取当前长期运行任务的实际语句。 我试图在ajax请求中创建民意调查,然后可以从服务器端返回状态并将其显示在客户端进度栏中。 有任何想法吗 ? 回答1 正确,最简单的方法是使用SignalR。 请在https://www.nuget.org/packages/Microsoft.AspNet.SignalR/2.1.2中下载Microsoft SignalR 在项目路径的单独文件夹中创建中心类,称为“中心”,将两个类文件添加到“中心”文件夹中 Startup.cs using Owin; using Microsoft.Owin; [assembly: OwinStartup(typeof(SignalRChat.Startup))] namespace SignalRChat { public class Startup { public void Configuration(IAppBuilder app) { // Any connection or hub wire up
  • SignalR .Net Client fails with 500 server error on device, on simulator works fine
    I'm trying to implement a chat in my app, with azure asp.net web api on back-end and xamarin ios on front-end. So on back-end I configure my hub with this lines: var hubConfiguration = new HubConfiguration(); hubConfiguration.EnableDetailedErrors = true; app.MapSignalR("/signalr", hubConfiguration); and here is my hub source: [HubName("Chat")] public class Chat : Hub { public Task JoinRoom(string roomName) { return Groups.Add(Context.ConnectionId, roomName); } public Task LeaveRoom(string roomName) { return Groups.Remove(Context.ConnectionId, roomName); } public Task Send(string message
  • 带Web套接字的SignalR(SignalR with Web Sockets)
    问题 我正在尝试使Websocket在我的开发环境中工作: Visual Studio 2010 Windows 7的信号R 0.51 最新的Chrome / Firefox 不幸的是,Javscript客户端正在使用长时间轮询。 当我在客户端强制使用网络套接字时,我根本无法连接: $.connection.hub.start({ transport: ['webSockets'] }) 服务器代码是自托管的,基于示例,如下所示: static void Main(string[] args) { string url = "http://localhost:8081/"; var server = new Server(url); // Map the default hub url (/signalr) server.MapHubs(); // Start the server server.Start(); Console.WriteLine("Server running on {0}", url); // Keep going until somebody hits 'x' while (true) { ConsoleKeyInfo ki = Console.ReadKey(true); if (ki.Key == ConsoleKey.X) { break; } } }