天道酬勤,学无止境

从控制器调用 SignalR Core Hub 方法(Call SignalR Core Hub method from Controller)

问题

如何从 Controller 调用 SignalR Core Hub 方法?
我将 ASP.NET Core 2.0 与 Microsoft.AspNetCore.SignalR (1.0.0-alpha2-final) 一起使用。

我有与 Excel、SolidEdge 通信的 Windows 服务......操作完成后,它会在 ASP.NET Core 应用程序中向我的控制器发送请求。 现在我需要用 SignalR 通知所有连接到服务器的客户端外部程序完成了一些任务。
我无法改变窗口服务的工作方式。 (无法从窗口服务连接到 SignalR)。
我发现老SignalR(大量的解决方案GlobalHost.ConnectionManager.GetHubContext ),但大部分已经改变,这些解决方案都不能工作了。

我的控制器:

[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);
    }
}

我的枢纽:

public class VarDesignHub : Hub
{
    public async Task TaskCompleted(int id)
    {
        await Clients.All.InvokeAsync("Completed", id);
    }
}
回答1

解决方案1

另一种可能性是将您的 HubContext 注入您的控制器,例如:

public VarDesignCommController(IHubContext<VarDesignHub> hubcontext)
{
    HubContext = hubcontext;
    ...
}

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

然后你也可以打电话

await this.HubContext.Clients.All.InvokeAsync("Completed", id);

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

解决方案2

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

public interface ITypedHubClient
{
    Task BroadcastMessage(string name, string message);
}

从 Hub 继承:

public class ChatHub : Hub<ITypedHubClient>
{
    public void Send(string name, string message)
    {
        Clients.All.BroadcastMessage(name, message);
    }
}

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

[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" };
    }
}
回答2

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

简单的答案是您不能直接从 MVC 控制器或其他地方调用集线器方法。 这是设计使然。 将集线器视为包含 SignalR Core 客户端要调用的端点,而不是服务器或控制器方法。

这是微软所说的(这是 SignalR Core 之前的文档,但它仍然适用于 SignalR Core):

您无需在服务器上实例化 Hub 类或从您自己的代码中调用其方法; SignalR Hubs 管道为您完成所有这些工作。 SignalR 每次需要处理集线器操作(例如客户端连接、断开连接或对服务器进行方法调用时)时,都会创建集线器类的新实例。

因为 Hub 类的实例是瞬态的,所以不能使用它们来维护从一个方法调用到下一个方法的状态。 每次服务器收到来自客户端的方法调用时,Hub 类的一个新实例都会处理该消息。 要通过多个连接和方法调用维护状态,请使用其他一些方法,例如数据库、Hub 类上的静态变量,或者不是从 Hub 派生的其他类。 如果在内存中持久化数据,在Hub类上使用静态变量等方法,应用域回收时数据会丢失。

如果要从在 Hub 类之外运行的自己的代码向客户端发送消息,则不能通过实例化 Hub 类实例来实现,但可以通过获取对 Hub 类的 SignalR 上下文对象的引用来实现...

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

下面是一个使用 ASP.NET Core 的简单内置 DI 框架的示例:

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

public class DoStuff : IDoStuff
{
    public string GetData()
    {
        return "MyData";
    }
}

public interface IDoStuff
{
    string GetData();
}

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

services.AddSingleton<IDoStuff, DoStuff>();

完整的 Startup.cs 如下所示:

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?}");
        });
    }
}

对于您的集线器类,注入单例,并在方法中使用它:

public class MyHub : Hub
{
    private readonly IDoStuff _doStuff;

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

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

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

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(...)

回答3

现在这里有详细记录

您可以通过将 IHubContext 的实例添加到构造函数中来将其注入控制器:

 public class HomeController : Controller { private readonly IHubContext<NotificationHub> _hubContext; public HomeController(IHubContext<NotificationHub> hubContext) { _hubContext = hubContext; } }

现在,通过访问 IHubContext 的实例,您可以调用集线器方法,就像您在集线器本身中一样。

 public async Task<IActionResult> Index() { await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}"); return View(); }
回答4

另一个不使用注入的答案在这里。

我设计了我的中心类,如下所示。

public class NotificationHub : Microsoft.AspNetCore.SignalR.Hub
{
    public static IHubContext<NotificationHub> Current { get; set; }
}

在你的创业班

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    NotificationHub.Current = app.ApplicationServices.GetService<IHubContext<NotificationFromServerHub>>();

}

所以,你可以从任何地方像这样使用。

public class MyBizClass
{
    public void DoSomething()
    {
        NotificationHub.Current.MyMethod(...);
    }
}
回答5

可能的解决方案是使用 C# 集线器客户端。 您只需创建一个新的 HubConnection 实例并使用它来调用所需的方法。 它与从 javascript/typescript 调用方法几乎相同。

using (var hubConnection = new HubConnection("http://www.contoso.com/")) 
{
    IHubProxy hubproxy = hubConnection.CreateHubProxy("MyHub");

    hubproxy.Invoke("TaskCompleted", id);
)

PS:我知道这是矫枉过正,但它真的只是原始问题的正确答案

回答6

我将这种方法用于我的 OWIN 自托管应用程序,因为我没有设置依赖项注入。

它可能很难看,但客户端会在启动时调用 Hub 构造函数。

public class HostHub : Hub
{
    public static HostHub Instance { get; private set; }

    public HostHub()
    {
        Instance = this;
    }

    public void BroadcastMessage(string message)
    {
        Clients.All.NewMessage(message);
    }
}

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在Typescript中使用ASP.NET Core SignalR和React创建实时应用程序
    目录 介绍 ScrumPoker应用程序 源代码 开发工具 基本步骤 后端代码 创建Hub 在Startup中注册集线器 创建持久性 让我们为客户端应用程序公开一些终端 启用Cors 前端代码 结论 SignalR现在包含在ASP.NET Core框架中,并且进行了大量改进,使其轻巧易用。令我惊讶的是,我找不到任何有关如何使用SignalR的好教程,并且无法使用它使相同的旧聊天应用程序变得有趣。我想到了用SignalR创建一些东西,而不是同一个无聊的聊天应用程序。 介绍 在本教程中,我将指导您完成创建实时应用程序所需的主要步骤。我不会在这里写完整的代码。您可以在github 上找到完整的源代码。 ScrumPoker应用程序 在本教程中,我们将创建一个有趣的应用程序,名为ScrumPoker。我们生活在敏捷的世界中,因此在我们的开发过程或每个冲刺周期中进行故事评估并指出要点很普遍。过去,我们曾经计划使用扑克牌,而团队则通过这些牌来进行故事评估,但是现在一切都在线上了,我们经常进行远程工作。 用户可以创建ScrumBoard链接并与队友共享链接。团队成员可以进入那里并开始指出故事。只有当创建的用户ScrumBoard允许他们查看时,团队给出的点才会显示在仪表板上。 用户会实时添加到仪表板上,他们提交的点也会实时反映出来。 源代码 ├───clientapp├───Contracts├
  • 请求线程外的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
  • 从控制器的动作中调用集线器方法(Call a hub method from a controller's action)
    问题 如何从控制器的动作中调用集线器方法? 正确的做法是什么? 有人在帖子中使用了它: DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver); var hub = hd.ResolveHub("AdminHub") as AdminHub; hub.SendMessage("woohoo"); 但是对我来说,这是在抛出: 不支持使用不是由HubPipeline创建的Hub实例。 我还阅读了您可以创建中心上下文的信息,但我不想赋予该操作以责任,即该操作执行的操作如下: hubContext.Client(...).someJsMethod(..) 回答1 正确的方法是实际创建中心环境。 取决于您的方式和位置,这是两种方法: 在集线器中创建一个静态方法(不必在集线器中,实际上可以在任何地方),然后可以通过AdminHub.SendMessage("wooo")调用它public static void SendMessage(string msg) { var hubContext = GlobalHost.ConnectionManager.GetHubContext<AdminHub>(); hubContext.Clients.All.foo(msg); } 一起避免使用静态方法
  • 如何在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
  • SignalR:如何从服务器调用.Net客户端方法?(SignalR: How to call .Net client method from server?)
    问题 我想将数据发送到我的控制台应用程序,并与“ someHub”建立连接。 我尝试按照示例中的链接进行操作,但没有结果。 服务器端代码: [HubName("somehub")] public class SomeHub : Hub { public override Task OnConnected() { //Here I want to send "hello" on my sonsole application Clients.Caller.sendSomeData("hello"); return base.OnConnected(); } } Clien旁码: public class Provider { protected HubConnection Connection; private IHubProxy _someHub; public Provider() { Connection = new HubConnection("http://localhost:4702/"); _someHub = Connection.CreateHubProxy("somehub"); Init(); } private void Init() { _someHub.On<string>("sendSomeData", s => { //This code is not
  • Call SignalR Core Hub method from Controller
    How can I call SignalR Core Hub method from Controller? I am using ASP.NET Core 2.0 with Microsoft.AspNetCore.SignalR (1.0.0-alpha2-final). I have windows service which communicate with Excel, SolidEdge ... When operation is complete it post request to my controller in ASP.NET Core application. Now I need to inform all clients connected to server with SignalR that external program completed some task. I can not change the way window service works. (Can not connect to SignalR from window service). I found plenty solution for old SignalR (GlobalHost.ConnectionManager.GetHubContext), but much has
  • SignalR协商404(SignalR Negotiate 404)
    问题 我正在使用SignalR 2.0。 在VS 2012上本地运行时,一切正常。但是,当我在IIS上发布站点时,它会中断。 该站点已加载,但其中一个脚本返回404 Not Found。 脚本是这样的。 https://example.com/signalr/negotiate?xxx 此路径确实不存在。 正确的路径应为: https://example.com / private / signalr / negotiate?xxx 注意该部分以粗体显示。 在网站(https://example.com/)内,我有另一个应用程序(https://example.com/private/)。 这是使用SignalR。 这似乎是SignalR中的错误,因为从我的私有站点可以访问signalr / hubs路径。 回答1 我有一个类似的问题。 这是用于配置/ signalr URL的文档。 但是,我的解决方案与文档不同。 我没有更改标准的app.MapSignalR() ,而是将客户端代码更改为使用/MyApp/signalr 。 这是代码,其中“ MyApp”是我的Web应用程序的虚拟目录。 var connection = $.hubConnection('/MyApp/signalr', {useDefaultPath: false}); var changesHub =
  • SignalR使用GlobalHost.ConnectionManager.GetHubContext从外部集线器调用客户端方法不起作用。 但是从集线器内部进行呼叫确实可以(SignalR calling client method from outside hub using GlobalHost.ConnectionManager.GetHubContext doesn't work. But calling from within the hub does)
    问题 我正在尝试从.net Web API控制器操作中调用客户端方法。 我可以这样做吗? 我可以找到的唯一一篇与我要完成的工作非常接近的帖子是: SignalR +通过操作方法将消息发布到集线器 在那里,使用GlobalHost.ConnectionManager.GetHubContext从asp.net MVC控制器操作中发送一条消息。 当我在Web API操作中尝试该操作时,不会引发任何错误,但是永远不会在客户端调用方法“ methodInJavascript”。 Public ActionResult MyControllerMethod() { var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); context.Clients.All.methodInJavascript("hello world"); // or context.Clients.Group("groupname").methodInJavascript("hello world"); } 当我在该动作中设置断点时,我看到代码已到达并执行。 不过,javascript客户端没有任何反应。 为什么? Web API到底有什么不同,以至于无法使用? 有没有其他人尝试过并取得成功? 当我从集线器“内部”调用“
  • 从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
  • 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
  • 在start()。done()之后,SignalR并不总是准备好了吗?(SignalR not always ready after start().done()?)
    问题 我有一个与SignalR一起工作的小项目,但是我得到了一些非常不一致的行为。 <script type="text/javascript"> $(function () { var chat = $.connection.brewBattleHub; $.connection.hub.start().done(function () { $("#broadcast").click(function () { // Call the chat method on the server chat.server.roll($("#username").val(), $("#drinkname").val()); }); chat.server.sendMessage("SignalR loaded..."); }); }); </script> 当我加载页面时,有时我会看到消息“ SignalR已加载”,而其他时候却没有。 页面上还有一些其他功能,有时这也不起作用。 如果我单击按钮并使事情发生的足够多,那么最终它们将一口气通过……从这一点来看,它是金色的,并且运行良好。 是否start().done() ? 不能确保一切都准备好了吗? ===附录,我没有引用jquery mobile(谷歌提到这样做存在错误) 回答1 本周我遇到了类似的问题,除了.done()中的代码从未运行过。
  • 使用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
  • 如何在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;
  • 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
  • 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
  • 如何使用SignalR集线器将消息从服​​务器发送到客户端(How do I send messages from server to client using SignalR Hubs)
    问题 我刚刚开始探索signalR,我希望能够从服务器向所有客户端发送消息。 这是我的集线器 using System; using System.Collections.Generic; using System.Linq; using System.Web; using SignalR; using SignalR.Hubs; using SignalR.Hosting.Common; using SignalR.Hosting.AspNet; using System.Threading.Tasks; namespace MvcApplication1 { public class Chat : Hub { public void Send(String message) { // Call the addMessage methods on all clients Clients.addMessage(message); } } } 这是我的客户页面 <script type="text/javascript"> $(function () { //Proxy created on the fly var chat = $.connection.chat; // Declare a function on the chat hub so the server can
  • SignalR call client methods from outside the Hub class AspNetCore
    I'm trying to call client methods outside the hub on SignalR, the link below shows how to do this in the old version, although i'm unsure how to do this in the SignalR ASP.NET Core version. I've found a reference to a old post and using a reference to Microsoft.AspNetCore.SignalR.Infrastructure.IConnectionManager although this namespace doesn't seem to existing anymore. An example would be great? Old version: How to call client methods and manage groups from outside the Hub class
  • Get Hub Context in SignalR Core from within another object
    I am using Microsoft.AspNetCore.SignalR (latest release) and would like to get the hub context from within another object that's not a Controller. In the "full" SignalR, I could use GlobalHost.ConnectionManager.GetHubContext<MyCoolHub>(); I have seen a lot of examples of just adding Microsoft.AspNetCore.SignalR.IHubContext<MyCoolHub> as a parameter to the Ctor of a Controller, but no examples (that work) for otherwise. ETA: So, this is what I have working. Is this hacky? public class MyHub : Hub public static IHubContext<MyHub> GlobalContext { get; private set; } public MyHub(IHubContext<MyHub
  • 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(如果没有,请参见脚注)
  • 将简单的喷射器与SignalR一起使用(Using Simple Injector with SignalR)
    问题 我以为使用SignalR可以很直接地使用自己的IoC,也许是这样。 最有可能我做错了什么。 到目前为止,这是我的代码: private static void InitializeContainer(Container container) { container.Register<IMongoHelper<UserDocument>, MongoHelper<UserDocument>>(); // ... registrations like about and then: var resolver = new SimpleInjectorResolver(container); GlobalHost.DependencyResolver = resolver; } 然后是我的课: public class SimpleInjectorResolver : DefaultDependencyResolver { private Container _container; public SimpleInjectorResolver(Container container) { _container = container; } public override object GetService(Type serviceType) { return _container