相关疑难解决方法(0)

ASP.NET Core RC2 SignalR Hub上下文请求线程

我目前正在尝试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 signalr asp.net-core asp.net-core-1.0 .net-core-rc2

15
推荐指数
3
解决办法
1万
查看次数

在ASP.NET Core SignalR中,如何从服务器向客户端发送消息?

我已经使用新发布的ASP.NET Core 2.1成功设置了SignalR服务器和客户端.我通过ChatHub扩展建立了一个聊天室Hub:每当有来自客户端的消息时,服务器就会通过它将其反弹回来Clients.Others.

我还不了解的是如何向客户端发送消息而不是作为对传入消息的响应.如果服务器正在工作并产生结果,我如何获得访问权限Hub以便向特定客户端发送消息?(或者我甚至需要访问Hub?是否有其他方式发送消息?)

搜索此问题很困难,因为大多数结果来自旧版本的ASP.NET和SignalR.

c# asp.net-core asp.net-core-signalr

12
推荐指数
1
解决办法
1万
查看次数

从另一个对象中获取SignalR Core中的Hub Context

我正在使用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)

c# asp.net-core asp.net-core-signalr

7
推荐指数
2
解决办法
6884
查看次数

使用SignalR Core将消息从Controller方法发送到Angular

我正在尝试将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)

c# signalr asp.net-core angular asp.net-core-signalr

6
推荐指数
1
解决办法
2081
查看次数

SignalR:如何在 ASP.NET MVC 中使用 IHubContext&lt;THub,T&gt; 接口?

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 …

c# asp.net-mvc dependency-injection signalr

6
推荐指数
1
解决办法
8128
查看次数

SignalR-从上下文调用静态类型的集线器

我试图弄清楚如何从服务器上调用强类型集线器上的方法。我正在使用.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)

如何在静态类型的集线器上调用方法,或者对集线器的工作方式有误解?

c# signalr asp.net-core-2.0

5
推荐指数
1
解决办法
1858
查看次数

从Controller调用SignalR Core Hub方法时的连接ID

这是另一个问题和答案的后续行动.呼叫HubContext.Clients.CallerHubContext.Clients.Others来自控制器的影响是什么?我看到它取决于连接ID.在这种情况下它会有什么价值?

如果连接ID(以及因此CallerOthers)无效,那么(从控制器操作中)我如何获得可以与HubContext.Clients方法一起使用的连接ID(对于当前调用Web API的客户端)?

c# signalr asp.net-core-2.1 asp.net-core-signalr

3
推荐指数
1
解决办法
7037
查看次数

如何将 SignalR 集线器类(不是集线器上下文)注入控制器

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。

signalr asp.net-core-2.1

3
推荐指数
1
解决办法
2909
查看次数

从 Controller .Net Core 2.1 调用 Signalr 方法

我正在尝试从 (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

3
推荐指数
1
解决办法
4925
查看次数

SignalR从Hub类AspNetCore外部调用客户端方法

我正在尝试在SignalR上调用集线器之外的客户端方法,下面的链接显示了如何在旧版本中执行此操作,尽管我不确定如何在SignalR ASP.NET Core版本中执行此操作.我找到了对旧帖子的引用,并使用了对Microsoft.AspNetCore.SignalR.Infrastructure.IConnectionManager的引用,尽管此命名空间似乎不再存在.一个例子会很棒吗?

旧版本:如何从Hub类外部调用客户端方法和管理组

signalr asp.net-core asp.net-core-signalr

2
推荐指数
1
解决办法
1526
查看次数