Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从控制器调用SignalR核心集线器方法

从控制器调用SignalR核心集线器方法
EN

Stack Overflow用户
提问于 2017-10-23 23:31:48
回答 8查看 88.7K关注 0票数 92

如何从控制器调用SignalR核心集线器方法?

我使用的是ASP.NET Core2.0和Microsoft.AspNetCore.SignalR (1.0.0-字母2-决赛)。

我有windows服务,它与Excel、SolidEdge .操作完成后,在ASP.NET核心应用程序中将请求发送给我的控制器。现在,我需要通知所有与SignalR连接到服务器的客户端,外部程序完成了一些任务。

我无法改变窗口服务的工作方式。(无法从窗口服务连接到SignalR )。

我为旧SignalR (GlobalHost.ConnectionManager.GetHubContext)找到了大量的解决方案,但是已经发生了很大的变化,这些解决方案不再起作用了。

我的控制器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Route("API/vardesigncomm")]
public class VarDesignCommController : Controller
{
    [HttpPut("ProcessVarDesignCommResponse/{id}")]
    public async Task<IActionResult> ProcessVarDesignCommResponse(int id)
    {
        //call method TaskCompleted in Hub !!!! How?

        return new JsonResult(true);
    }
}

我的枢纽:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class VarDesignHub : Hub
{
    public async Task TaskCompleted(int id)
    {
        await Clients.All.InvokeAsync("Completed", id);
    }
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2017-10-24 01:27:08

解决方案1

另一种可能是将HubContext注入控制器,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public VarDesignCommController(IHubContext<VarDesignHub> hubcontext)
{
    HubContext = hubcontext;
    ...
}

private IHubContext<VarDesignHub> HubContext
{ get; set; }

然后你也可以打电话给

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await this.HubContext.Clients.All.InvokeAsync("Completed", id);

但是,您将在所有客户端上直接调用方法。

解决方案2

您还可以使用类型化集线器:简单地创建一个接口,在其中定义服务器可以在客户端上调用哪些方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface ITypedHubClient
{
    Task BroadcastMessage(string name, string message);
}

从中心继承:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ChatHub : Hub<ITypedHubClient>
{
    public void Send(string name, string message)
    {
        Clients.All.BroadcastMessage(name, message);
    }
}

将输入的hubcontext注入控制器,并使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Route("api/demo")]
public class DemoController : Controller
{
    IHubContext<ChatHub, ITypedHubClient> _chatHubContext;
    public DemoController(IHubContext<ChatHub, ITypedHubClient> chatHubContext)
    {
        _chatHubContext = chatHubContext;
    }

    // GET: api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        _chatHubContext.Clients.All.BroadcastMessage("test", "test");
        return new string[] { "value1", "value2" };
    }
}
票数 125
EN

Stack Overflow用户

发布于 2018-10-29 09:01:03

目前的答案没有回答提出的问题。

简单的答案是,您不能直接从MVC控制器或其他地方调用hub方法。这是故意的。将集线器想象为包含要调用的SignalR核心客户端的端点,而不是服务器或控制器方法。

下面是微软他说 (这是前SignalR文档,但仍然适用于SignalR Core):

您不实例化集线器类,也不从服务器上自己的代码调用它的方法;所有这些都是由SignalR集线器管道为您完成的。每次需要处理集线器操作时,例如当客户端连接、断开连接或对服务器进行方法调用时,SignalR都会创建集线器类的新实例。 因为集线器类的实例是短暂的,所以不能使用它们来维护从一个方法调用到下一个方法的状态。每当服务器从客户端接收到方法调用时,集线器类的新实例将处理该消息。若要通过多个连接和方法调用来维护状态,请使用其他方法,如数据库、集线器类上的静态变量或不从集线器派生的其他类。如果使用Hub类上的静态变量等方法将数据持久化在内存中,则应用域回收时数据将丢失。 如果您希望从运行在集线器类之外的自己代码中向客户端发送消息,则不能通过实例化集线器类实例来完成此任务,但可以通过获取对集线器类的SignalR上下文对象的引用来实现.

如果集线器中有您需要调用的代码,最好将其放入可从任何地方访问的外部类或服务中。

下面是一个例子,它使用了一个简单的ASP.NET内核内置DI框架:

假设您需要调用的代码在DoStuff.cs中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DoStuff : IDoStuff
{
    public string GetData()
    {
        return "MyData";
    }
}

public interface IDoStuff
{
    string GetData();
}

在Startup.cs中,使用内置容器配置单例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddSingleton<IDoStuff, DoStuff>();

完整的Startup.cs如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddSignalR();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddSingleton<IDoStuff, DoStuff>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseSignalR(routes =>
        {
            routes.MapHub<MyHub>("/myhub");
        });

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

对于hub类,注入单例,并在方法中使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyHub : Hub
{
    private readonly IDoStuff _doStuff;

    public MyHub(IDoStuff doStuff)
    {
        _doStuff = doStuff;
    }

    public string GetData()
    {
       return  _doStuff.GetData();
    }
}

然后,在控制器中注入IHubContext和单例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HomeController : Controller
{
    private readonly IDoStuff _doStuff;
    private readonly IHubContext<MyHub> _hub;

    public HomeController(IDoStuff doStuff, IHubContext<MyHub> hub)
    {
        _doStuff = doStuff;
        _hub = hub;
    }

    public async Task<IActionResult> Index()
    {
        var data = _doStuff.GetData();
        await _hub.Clients.All.SendAsync("show_data", data);

        return View();
    }
}

当然,Javascript或其他客户端应该配置了一个show_data回调。

注意,我们使用注入的集线器上下文将数据发送到所有SignalR客户端:_hub.Clients.All.SendAsync(.)

票数 55
EN

Stack Overflow用户

发布于 2019-06-23 07:01:41

这现在已经有了很好的记录,这里

通过将IHubContext实例添加到构造函数中,可以将它注入控制器: 公共类HomeController :控制器{私有只读IHubContext _hubContext;公共HomeController(IHubContext hubContext) { _hubContext = hubContext;} 现在,通过对IHubContext实例的访问,您可以像调用集线器本身一样调用hub方法。 公共异步任务索引(){等待_hubContext.Clients.All.SendAsync(“通知”,$“加载在:{DateTime.Now}上的主页”);返回视图();}

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46904678

复制
相关文章
JQuery Div scrollTop ScrollHeight
jQuery 里和滚动条有关的概念很多,但是有三个属性和滚动条的拖动有关,就是:scrollTop、scrollLeft、scrollHeight。其中 scrollHeight 属性,互联网上几乎搜素不到关于它的应用技巧,而我正好需要用到它。
全栈程序员站长
2022/09/15
2.8K0
获取页面滚动距离pageYOffset、scrollY、scrollTop
在获取页面滚动距离的高度时候,往往有不同的获取方式,而且不同的属性浏览器支持稍有差别:
用户1349575
2022/02/13
3.8K0
html 滚动条 scrolltop scrollheight,浅谈JavaScript中scrollTop、scrollHeight、offsetTop、offsetHeight…
浅谈JavaScript中scrollTop、scrollHeight、offsetTop、offsetHeight
全栈程序员站长
2022/09/15
2.3K0
html 滚动条 scrolltop scrollheight,浅谈JavaScript中scrollTop、scrollHeight、offsetTop、offsetHeight…
滚动条三要素scrollTop clientHeight scrollHeight
插件 https://github.com/inuyaksa/jquery.nicescroll
全栈程序员站长
2022/09/15
1.3K0
jQuery第二十一篇 scrollTop
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> *{ margin: 0; padding: 0; } .scroll{ width: 100px; height: 200px; border: 1p
贵哥的编程之路
2020/10/28
2910
jQuery scroll(滚动)延迟加载
延迟加载 $(window).scroll(function(){ var scrollHeight = $(document).height(); //文档高度 var scrollTop = $(this).scrollTop(); //滚动条卷去高度 var windowHeight = $(this).height(); // 窗口高度 // console.log(scrollHeight, scrollTop, windowHeight) if(scrol
deepcc
2018/05/16
9.1K0
liMarquee – jQuery无缝滚动插件
liMarquee 是一款基于 jQuery 的无缝滚动插件,类似于 HTML 的 marquee 标签,但比 marquee 更强大。它可以应用于任何 Web 元素,包括文字、图像、表格、表单等元素,同时它可以设置不同的滚动方向(左右上下)、滚动速度、鼠标悬停暂停、鼠标拖动、加载 xml 文件等等。
kirin
2021/01/29
8.9K0
jquery横向滚动条
此代码献给wendy 由于工作太忙,下次再整理成插件调用,先记录下来,欢迎同学们提意见。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" conten
deepcc
2018/05/16
7K0
jquery 页面滚动事件 scroll()
在没有任何元素的情况下,document的宽高是与window的宽高一致的,那么如果给document加入一些元素呢?
Devops海洋的渔夫
2019/06/02
10.1K0
jquery无缝隙连续滚动代码
通常我们在做网页布局的时候,客户为要求在某个地方实现图片滚动或文字滚动的展示,这就是所谓的跑马灯效果,在以前蓝叶用html标签marquee来做跑马灯效果,marquee不是很完美,如果一个层的宽度或高度过长,那么中间会用空隙显得很不美观;现在蓝叶用jquery无缝隙连续滚动代码来实现跑马灯效果,这段jquery无缝隙连续滚动代码可以自由设置,向左、向右、向上、向下的滚动效果,如果你需要就把以下代码复制到你需要的地方,稍微进行修改即可使用了,这是一段jquery代码,需要jquery库的支持才行。
李维亮
2021/07/09
6.8K0
jquery.countup实现数字滚动
效果图 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compa
明知山
2020/09/03
5.4K0
SCrollTOP scrollHeight
jQuery 里和滚动条有关的概念很多,但是有三个属性和滚动条的拖动有关,就是:scrollTop、scrollLeft、scrollHeight。其中 scrollHeight 属性,互联网上几乎搜素不到关于它的应用技巧,而我正好需要用到它。
全栈程序员站长
2022/09/15
2.3K0
SCrollTOP scrollHeight
jQuery实现消息滚动播放的效果
场景需求: 在大屏幕上,消息会进行一个实时滚动播报的效果,将现有的内容进行一个来回滚动的播放~~
王小婷
2021/04/04
4.9K0
jquery 滚轮插件 示例 - 整屏滚动
要做出这个效果,其实不用说,首先要把这五个div的基本HTML+CSS给写出来先。
Devops海洋的渔夫
2019/05/30
4.6K0
jQuery滚动到页面指定位置
        在前端的页面开发中,经常会碰到页面跳转问题,这个跳转指的是页面内部跳转到指定位置,通常是在有滚动条的情况下,网上介绍的方法很多,本文主要是介绍jQuery函数中的一个小trick,.focus()函数。
Tyan
2022/05/09
7K0
jQuery滚动到页面指定位置
jQuery 尺寸、位置操作
​ jQuery中分别为我们提供了两套快速获取和设置元素尺寸和位置的API,方便易用,内容如下。
梨涡浅笑
2022/05/08
1.1K0
jQuery 尺寸、位置操作
scrollTop()方法
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说scrollTop()方法,希望能够帮助大家进步!!!
Java架构师必看
2022/09/26
1.3K0
scrollTop()方法
Vue 滚动条定位问题
作者:matrix 被围观: 9,147 次 发布时间:2018-06-28 分类:零零星星 | 3 条评论 »
HHTjim 部落格
2022/09/26
9110
Vue 滚动条定位问题
scrollIntoView()方法导致整个页面产生偏移
今天在做页面UI改版的时候发现,我之前使用的是dom.scrollIntoView(); 使得点击右侧题目编号的时候,让左侧题目滚动到页面可视区域。
Daotin
2021/01/21
4.3K0
js常用事件整理—兼容所有浏览器
1.鼠标滚动事件。 说明:返回值 大于0向上滚动,小于0向下滚动。 兼容型:所有浏览器。 代码: /*********************** * 函数:鼠标滚动方向 * 参数:event * 返回:滚轮方向[向上(大于0)、向下(小于0)] *************************/ var scrollFunc = function(e) { var direct = 0; e = e || window.event; if (e.wheelDelta) {//
磊哥
2018/05/08
2.2K0

相似问题

jQuery滚动过远

10

ScrollTop - jQuery不滚动

21

jQuery scrollTop不滚动

40

jQuery .scrollTop没有正确滚动

20

jQuery - scrollTop命令未滚动

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文