标签: asp.net-core-signalr

在 .NET 控制台客户端应用程序中使用 ASP.NET Core SignalR 从 Azure SignalR 接收消息

我正在学习 SignalR 但遇到了障碍。

我有一个 Azure 函数,已成功发布到 Azure SignalR 托管服务(在无服务器模式下配置)

我一直在关注这个快速入门:

快速入门:使用 C# 通过 Azure Functions 和 SignalR 服务创建聊天室

我想要实现的基本上是将来自服务器的消息接收到我的客户端应用程序中。为了原型化,我创建了一个控制台应用程序。

我添加了以下 Nuget 包

Microsoft.AspNetCore.SignalR.Client -版本 1.1.0 Microsoft.Azure.WebJobs.Extensions.SignalRService

所有基础设施似乎都工作正常 - 我的假设是我可以在以下地址运行演示网站,将其指向我的本地实例(或托管在 Azure 中的实例) https://azure- samples.github.io/signalr-service-quickstart-serverless-chat/demo/chat-v2/

我的 AzureFunction 发布的消息直接发布到聊天窗口中。

如何将这些消息打印到控制台?

using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using System;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Console.ReadKey();

            var connection = new HubConnectionBuilder().WithUrl("http://localhost:7071/api").Build();


            connection.On<SignalRMessage>("newMessage", (message) =>
            {
                Console.WriteLine(message.Arguments);
            });


            connection.On("newMessage", (string server, string message) =>
            {
                Console.WriteLine($"Message from …
Run Code Online (Sandbox Code Playgroud)

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

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

处理 Asp.Net Core 3.1 中 SignalR 集线器中的所有异常

在Web API中,所有异常都可以通过中间件来处理。在 Asp.Net Core 5.0 中,集线器过滤器将完成这项工作。

但是如何在 SignalR 集线器中处理 Asp.Net Core 3.1 中的异常呢?有没有唯一的方法可以在每个方法中编写 try/catch ,如下所示?

[Authorize]
public class OrdersHub : BaseHub
{
        public async Task GetOrder(Guid requestId, int orderId)
        {
            try
            {
                var data = await ordersService.GetOrderAsync(orderId);
                await Clients.Caller.SendAsync("GetOrderResult", requestId, result);
            }
            catch (Exception ex)
            {
                await Clients.Caller.Reject(requestId, ex);
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

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

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

过滤传出 SignalR Core Hub 消息

我正在使用 SignalR 和 .Net 5.0,并利用集线器过滤器对 SignalR Hub 的传入调用执行代码。

我正在寻找一种方法来对从集线器到客户端的传出消息执行相同的操作,但似乎没有其他选择。或者,我希望在发送内置Ping 消息时专门挂接并执行代码。

看起来旧版本的 HubPipeLineModule 中曾经可以实现类似的功能,但我无法找到任何方法在当前的 SignalR 中实现此目的。这可能吗?

signalr signalr-hub asp.net-core-signalr .net-5

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

Asp.Net Core 无法访问已处置的上下文实例

我正在尝试实现 SignalR 以便使用来自角度前端应用程序的数据。

我已经检查了谷歌上能找到的所有结果,但仍然无法解决我的问题。

我收到的错误是:

无法访问已释放的上下文实例。导致此错误的一个常见原因是处置从依赖项注入解析的上下文实例,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果您使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。对象名称:“AdminContext”

控制器

[Route("api/[controller]")]
[ApiController]
public class ChartController : ControllerBase
{
    private IHubContext<ChartHub> _hub;
    private readonly ILiveMonitoringService _service;

    public ChartController(IHubContext<ChartHub> hub, ILiveMonitoringService service)
    {
        _hub = hub;
        _service = service;

    }
    public IActionResult Get()
    {
        var timerManager = new TimerManager(async () => await _hub.Clients.All.SendAsync("transferchartdata", await _service.GetAllAsync()));
        return Ok(new { Message = "Request Completed" });
    }
}
Run Code Online (Sandbox Code Playgroud)

服务

public Task<List<LiveMonitoring>> GetAllAsync()
{
    return _repository.GetAll().Take(100).ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

存储库

public IQueryable<TEntity> GetAll()
{
    try
    {
        return _adminContext.Set<TEntity>();
    } …
Run Code Online (Sandbox Code Playgroud)

signalr entity-framework-core asp.net-core asp.net-core-signalr

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

SignalR 长轮询重复调用 /negotiate 和 /hub POST,并偶尔在 Azure Web App 上返回 404

我们已在 Azure Web 应用程序(Windows 应用服务计划)上运行的 ASP.NET Core 5.0 Web 项目上启用了 SignalR。我们的 SignalR 客户端是使用 NPM 包(版本 5.0.11)的 Angular 客户端@microsoft/signalr

我们的枢纽位于/api/hub/notification

对于大多数客户端来说,一切都按预期进行,Web 套接字连接已建立,我们可以从客户端调用到服务器的方法,反之亦然。

对于我们的一些客户,我们看到在短时间内收到大量请求(每个客户端每分钟多个请求)POST /api/hub/notification/negotiatePOST /api/hub/notification自从我们看到请求以来,这些客户端似乎切换到长轮询而不是使用 Web 套接字POST /api/hub/notification

我们怀疑受影响的客户端可能位于代理或防火墙后面,这些代理或防火墙禁止 Web 套接字,因此连接首先切换为长轮询。

以下屏幕截图显示了单个用户在短时间内向集线器端点发出的请求。该列表很长,因为只要用户打开我们的网站,这种模式就会重复。我们看到两个奇怪的事情:

  1. 客户端/negotiate每 15 秒重复调用两次。
  2. 对 的调用POST /notification?id=<connectionId>恰好需要 15 秒,并且具有相同连接 ID 的后续调用将返回 404 响应。然后该模式重复并/negotiate再次被调用。

要求

出于测试目的,我们仅在客户端中启用长轮询。这也符合我们的预期。不幸的是,我们目前无法访问发生此行为的用户的浏览器或网络,因此我们很难重现该问题。

更多注意事项:

  1. 目前,我们只有一个正在运行的 Web 应用程序实例。
  2. 我们将Redis背板用于未来的横向扩展场景。
  3. ARR 关联 cookie 已启用,并且 Azure Web 应用程序中的 Web 套接字也已启用。
  4. Web App 实例不会遭受高 CPU 使用率或高内存使用率的影响。
  5. 除了添加 …

azure long-polling asp.net-core-signalr

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

与 aws eks 一起使用时在 SignalR (.net core) 中启用 SkipNegotation 的优点或缺点

我们使用 AWS kubernetes 集群 (EKS) 以及 ALB/Ingress 和 redis 缓存来进行信号器连接。如果我们的副本集为 3,连接到服务会随机抛出 404 错误。设置选项时:

SkipNegotiation = true
Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets
Run Code Online (Sandbox Code Playgroud)

一切似乎都有效。我找不到设置SkipNegotation为 true 的任何缺点。false但找不到这是否有任何副作用(默认设置一定有原因)。

设置会SkipNegotation导致true任何进一步的问题吗?

正在运行的示例代码:

Console.WriteLine("Start");
HubConnection connection = new HubConnectionBuilder()
    .WithUrl("https://<url>/api/v1/taskboard", o =>
    {
        o.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets;
        o.SkipNegotiation = true;
    })
    .WithAutomaticReconnect()
    .Build();

await connection.StartAsync();


connection.On<string>("ReceiveMessage", message =>
{
    Console.WriteLine(message);
});

for (int i = 0; i < 20; i++)
{
    await connection.InvokeAsync("SendMessage", $"Hello {i}");
    await Task.Delay(55);
}

await connection.StopAsync();
await connection.DisposeAsync(); …
Run Code Online (Sandbox Code Playgroud)

c# websocket signalr kubernetes-ingress asp.net-core-signalr

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

将用于微服务的 SignalR 与 API 网关集成

我正在设计一个基于 .Net 核心的微服务系统。架构系统将如下图所示。

在此处输入图片说明

问题是:我在 Microsoft 的网站上阅读了有关 SignalR 的通知,需要集成 SignalR(实时)以获取通知。但我认为我应该把集线器(API 网关?,微服务?...)放在哪里?我如何为这个系统应用signalR。

谢谢。

architecture signalr microservices asp.net-core-signalr

4
推荐指数
1
解决办法
5796
查看次数

检测SignalR Core连接丢失的连接

我正在尝试检测SignalR Core连接何时丢失,以便我可以创建一个新连接或至少警告用户.

connection.on('closed', data => {
    alert('Connection Closed');
});
Run Code Online (Sandbox Code Playgroud)

这似乎没有效果.消息停止到达,但不会触发此处理程序.

在相关的说明中,该库的新版本的事件处理文档在哪里?

javascript connection signalr asp.net-core asp.net-core-signalr

4
推荐指数
1
解决办法
2465
查看次数

如何在集线器SignalR ASP.NET Core 2.1中读取标头数据

我正在尝试将userId传递给连接到signalR的集线器。客户端通过以下方式建立连接:

         connection = new HubConnectionBuilder()
            .WithUrl("http://localhost:56587/hub", options =>
            {
                options.Headers["UserId"] = loginTextBox.Text;
            })
            .AddMessagePackProtocol()
            .Build();
Run Code Online (Sandbox Code Playgroud)

如何在我的集线器的OnConnectedAsync()方法中读取此标头?

header asp.net-web-api signalr-hub asp.net-core asp.net-core-signalr

4
推荐指数
1
解决办法
1067
查看次数

SignalR 未序列化/反序列化自定义 DataMember 名称

我正在做一个项目并试图将 SignalR 集成到其中。我有一个带有数据契约的类,它允许我在客户端上使用下划线分隔的格式,在服务器上使用标准的 Pascal Case,如下所示:

[DataContract]
public class Foo {

    [DataMember(Name = "first_name")]
    FirstName { get;set; }

    [DataMember(Name = "last_name")]
    LastName { get;set; }

    [DataMember(Name = "phone")]
    Phone { get;set; }
}
Run Code Online (Sandbox Code Playgroud)

这在通过 fetch 命令将数据传递到 Razor Page OnGet 和 OnPost 方法时工作正常,但在使用 SignalR 时不起作用。

当通过 SignalR 将数据发送到服务器时,first_name并且last_name为空,而phone被正确发送。

如何DataMember在序列化/反序列化时让 SignalR 尊重名称?

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

4
推荐指数
1
解决办法
1019
查看次数