标签: azure-signalr

Azure SignalR 中的默认/无服务器/经典设置之间有什么区别?

我已经为 REST API 设置了 Azure SignalR 服务。设置下共有三种模式:DefaultServerlessClassic。我找不到有关这些项目中的每一个设置的任何信息。到目前为止,我唯一得到的一件事是,如果我将 Azure SignalR 用于 Azure Functions 或 REST API,则最好使用Serverless option

文档

仅当通过 Azure Functions 绑定或 REST API 使用 Azure SignalR 服务时,才将服务模式设置更改为无服务器。否则将其保留为经典或默认。

ASP.NET SignalR 应用程序不支持无服务器模式。始终对 Azure SignalR 服务实例使用默认或经典。

你能帮我找出每个选项的设置吗?

Azure SignalR 设置

azure signalr asp.net-core-signalr azure-signalr azure-rest-api

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

为什么在部署 Blazor 服务器端应用时推荐使用 Azure SignalR 服务?

当我在 Azure 上发布 Blazor 服务器端应用程序时,Visual Studio 会提示一条消息:

您的应用程序正在使用 SignalR。对于需要扩展的环境,我们强烈建议添加对 Azure SignalR 服务的依赖。

但是,我的应用程序可以正常工作,无需使用 Azure SignalR 服务。所以我想知道整合它是否真的有意义,或者这只是微软从我们口袋里多掏几美元的一种方式......

有没有人试过在有和没有 Azure SignalR 服务的情况下部署 Blazor 服务器端应用程序,以测试在性能方面是否有任何实际差异?我应该从中获得什么样的优势?

在此处输入图片说明

azure asp.net-core-signalr azure-signalr blazor-server-side asp.net-blazor

12
推荐指数
3
解决办法
3047
查看次数

SignalR .NET客户端连接到Blazor .NET Core 3应用程序中的Azure SignalR服务

我正在尝试在ASP.NET Core 3.0 Blazor(服务器端)应用程序与Azure SignalR服务之间建立连接。最后,我将SignalR客户端(服务)注入到一些Blazor组件中,以便它们可以实时更新我的​​UI / DOM。

我的问题是,.StartAsync()在集线器连接上调用方法时,我收到以下消息:

响应状态代码不表示成功:404(未找到)。

BootstrapSignalRClient.cs

该文件加载了我对SignalR服务的配置,包括URL,连接字符串,键,方法名称和集线器名称。这些设置在静态类中捕获,SignalRServiceConfiguration并在以后使用。

public static class BootstrapSignalRClient
{
    public static IServiceCollection AddSignalRServiceClient(this IServiceCollection services, IConfiguration configuration)
    {
        SignalRServiceConfiguration signalRServiceConfiguration = new SignalRServiceConfiguration();
        configuration.Bind(nameof(SignalRServiceConfiguration), signalRServiceConfiguration);

        services.AddSingleton(signalRServiceConfiguration);
        services.AddSingleton<ISignalRClient, SignalRClient>();

        return services;
    }
}
Run Code Online (Sandbox Code Playgroud)

SignalRServiceConfiguration.cs

public class SignalRServiceConfiguration
{
    public string ConnectionString { get; set; }
    public string Url { get; set; }
    public string MethodName { get; set; }
    public string Key { get; set; }
    public string HubName { …
Run Code Online (Sandbox Code Playgroud)

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

9
推荐指数
1
解决办法
475
查看次数

使用 Azure SignalR 向特定用户发送消息

使用Azure SignalR(不是 .Net Core SignalR),是否Clients.Users.SendAsync支持向特定用户发送消息?

[Authorize]
public class ChatHub : Hub
{
    public async Task OnNewMessage(string userId, string message)
    {
        await Clients.Users(userId) 
             //Does Azure SignalR supports sending message to specific user,
             // the way .Net Core SignalR does it
            .SendAsync("OnNewMessage", userId, message);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果是,Asp.Net Identity Claims Principal 如何传递给 Azure SignalR?

编辑:2021 年 6 月 18 日

以下回复并未解决这些问题。抱歉,我已经按照文档进行了自定义UserIdBasedProvider等。我想强调一下 -

这个问题与 SignalR 的处理方式有关.Users(<*some-user-id*>).Send()

理想情况下,我们会 .Client(<connection id>).Send()向特定用户发送消息。但是对于这种架构,我们必须自己将 userId 和 connectionId 存储在 DB 等中。 …

c# azure signalr azure-signalr

8
推荐指数
1
解决办法
441
查看次数

如何检查 Azure SignalR 服务中的组中有多少连接?

我正在尝试实现 Azure SignalR 服务,以促进桌面、asp.net-core 和 xamarin.ios 应用程序之间的两种方式的消息传递。

我已经Hub按照微软的文档在这里创建了一个:https : //docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-2.2

中心:

public class ChatHub : Hub
{
    public Task SendMessage(string user, string message)
    {
        return Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}
Run Code Online (Sandbox Code Playgroud)

当用户连接到集线器时,我将用户的连接添加到组中,如下所示:https : //docs.microsoft.com/en-us/aspnet/core/signalr/groups?view=aspnetcore-2.2

添加到组:

public async Task AddToGroup(string groupName)
{
    await Groups.AddToGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}

public async Task RemoveFromGroup(string groupName)
{
    await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}
Run Code Online (Sandbox Code Playgroud)

发送消息时,它有一个组名作为参数,我想在将消息发送到任何注册客户端之前检查提供的组是否有任何连接,如果没有连接,我想发送推送通知(已经有推送通知的工作代码)

发送带有通知回退的消息:

public class ChatHub : …
Run Code Online (Sandbox Code Playgroud)

c# azure xamarin.ios asp.net-core azure-signalr

6
推荐指数
0
解决办法
1042
查看次数

Azure WebJob 不向 Azure SignalR 服务发送 SignalR 消息

我有一个 Asp.Net Core Api 3.1 和一个 Azure WebJob,两者都在 Azure 应用服务上运行。他们都需要发送通知,但都不会接收消息。分解它:

  • 我在云中拥有每个应用程序都指向的 Azure SignalR 服务的单个实例。

  • 我创建的 Hub 类位于 Api 和 WebJob 项目都引用的库中。

  • 客户端只能通过 Api 连接到 Hub。

  • 当 Api 向连接发送消息时一切正常,但 WebJob 却不然。

真的不想将 WebJob 作为客户端运行,因为那样我就必须处理身份验证。我只是希望它作为同一集线器的另一个实例运行,该集线器将消息发送到与 API 相同的组。此外,此 WebJob 不适合作为 Azure 函数运行,因为它需要很长时间。

我在配置 WebJob 的方式中遗漏了一些内容,因为它似乎没有连接到 Azure SignalR。

当 WebJob 尝试发送消息时,我收到以下错误:(我尚未发布到 Azure,因此这一切都发生在我的本地计算机上)

Microsoft.Azure.SignalR.ServiceLifetimeManager[100] 无法发送消息(空)。Microsoft.Azure.SignalR.Common.AzureSignalRNotConnectedException:Azure SignalR 服务尚未连接,请稍后重试。在 Microsoft.Azure.SignalR.ServiceConnectionManager 1.WriteAsync(ServiceMessage serviceMessage) at Microsoft.Azure.SignalR.ServiceLifetimeManagerBase1.<>c__DisplayClass22_0 1.<WriteAsync>b__0(T m) at Microsoft.Azure.SignalR.ServiceLifetimeManagerBase1.WriteCoreAsync[T](T 消息,Func`2 任务)

网络工作主要:

using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MyProject.Data; …
Run Code Online (Sandbox Code Playgroud)

azure azure-webjobs azure-webjobs-triggered asp.net-core-signalr azure-signalr

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

SignalR 中基于资源的授权

我有带有自定义策略和授权处理程序的 Web API。我想重用授权处理程序,但是当在信号器的集线器上使用属性时 HttpContext 为空。

例如,这是我的控制器。

[Authorize]
public sealed class ChatsController : ControllerBase
{
    [HttpPost("{chatId}/messages/send")]
    [Authorize(Policy = PolicyNames.ChatParticipant)]
    public Task SendMessage() => Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)

这是我的授权处理程序。我可以从 HttpContext 中提取“chatId”,然后使用我的自定义逻辑来授权用户。

internal sealed class ChatParticipantRequirementHandler : AuthorizationHandler<ChatParticipantRequirement>
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public ChatParticipantRequirementHandler(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ChatParticipantRequirement requirement)
    {
        if(_httpContextAccessor.HttpContext != null)
        {
            // Logic
        }

        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于 Azure SignalR,因为我无权访问 HttpContext。我知道我可以提供自定义 IUserIdProvider,但我不知道如何从我的自定义授权处理程序中的“Join”方法访问“chatId”。

[Authorize]
public sealed class ChatHub : Hub<IChatClient>
{
    [Authorize(Policy = …
Run Code Online (Sandbox Code Playgroud)

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

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

如何在 Visual Studio 的 Azure Functions 应用程序中调用和调试 SignalRTrigger 函数

我正在按照本指南使用 SignalR 触发器绑定构建我的第一个 Azure Function App 。我已经在 Azure 中设置了 Function App 和 SignalR 服务。

但现在我需要调试我的 SignalR 触发函数之一。我尝试使用本地函数主机 (func.exe) 使用 Visual Studio 2022 来执行此操作,只需在我的 Azure Functions 项目中按 F5 即可。

我的 ServerlessHub 带有一个函数 JoinGroup,我想在 Visual Studio 中调用和调试该函数。

        namespace FunctionApp
        {
            public class SimpleChat : ServerlessHub
            {
                [FunctionName("negotiate")]
                public SignalRConnectionInfo Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req)
                {
                    var claims = GetClaims(req.Headers["Authorization"]);
                    return Negotiate(
                        claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value,
                        claims
                    );
                }

                [FunctionName(nameof(JoinGroup))]
                public async Task JoinGroup([SignalRTrigger]InvocationContext invocationContext, string connectionId, string groupName)
                {
                    throw new ApplicationException("CODE REACHED"); …
Run Code Online (Sandbox Code Playgroud)

c# signalr signalr-hub azure-functions azure-signalr

6
推荐指数
0
解决办法
596
查看次数

Azure SignalR 服务连接未激活

我从 2.4.0 更新了我们的信号器包并添加RunAzureSignalRRunSignalR. 在 de 中添加了此代码Startup.cs

app.Map("/signalr", map =>
{
    var hubConfiguration = new HubConfiguration
    {
        EnableDetailedErrors = true
    };

    map.RunAzureSignalR(typeof(Startup).FullName, hubConfiguration, options =>
    {
        options.ConnectionString = AppApiSettings.SignalRServiceConnectionString;
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试向集线器发送消息时,出现异常The connection is not active, data cannot be sent to the service.。找不到任何原因会发生这种情况或服务无法运行的原因。

当我使用 RunSignalR(自托管)时,一切运行良好。

任何帮助将不胜感激。

asp.net-mvc signalr-2 azure-signalr

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

Azure SignalR错误:(429)太多请求

我正在将Azure SignalR与Asp.Net MVC API(.net框架而不是.net核心)一起使用。我永远无法连接到Azure的SignalR服务(尝试任何可能的配置),而当Signalr自托管时一切正常。

当我启用CLR异常时(在“异常设置”窗格中,通过检查“公共语言运行时异常”下的所有内容),我不断收到以下两个错误:

1. System.Net.WebException:'远程服务器返回错误:(429)请求太多。

2. System.Net.WebSockets.WebSocketException:'无法连接到远程服务器'。内部异常WebException:远程服务器返回错误:(429)太多请求。

我使用的是SignalR Free层,但也尝试使用Standard层,最终得到相同的结果。

我一直在检查Azure门户上“概述”选项卡下的“连接(最大)”图,并一直观察“服务器20,客户端0”。

第一次遇到错误时,我以为我确实尝试了太多次连接,并达到最大连接/尝试次数,因此放弃了尝试。一段时间(大约24小时)后,我仅尝试了3次,仍然遇到相同的异常(429-请求过多)。

这是我的配置(在中Startup.cs):

app.MapAzureSignalR(
                "/signalr",
                GetType().FullName,
                new HubConfiguration
                {
                    // tried all combinations of boolean values below.
                    EnableDetailedErrors = true,
                    EnableJSONP = true,
                    EnableJavaScriptProxies = true
                }, options =>
                {
                    options.ConnectionCount = 5; // tried increasing and decreasing that number.
                    options.ConnectionString = "<my connection string from azure portal signalr service>";
                    options.AccessTokenLifetime = TimeSpan.FromDays(1); // tried even removing.
                }
            );
Run Code Online (Sandbox Code Playgroud)

此代码在我的本地计算机上运行,​​而不在Azure的AppService上运行。但是,它也不会在AppService上运行。因为在本地计算机上调试更容易,所以我一直在尝试在本地计算机上进行调试。

我在互联网上进行搜索,但未发现与我的问题相关的任何内容。

我该如何解决这个问题?

编辑: 我安装了以下软件包。

<package id="Microsoft.AspNet.SignalR" version="2.4.1" …
Run Code Online (Sandbox Code Playgroud)

c# azure signalr azure-signalr

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