标签: asp.net-core-signalr

从另一个对象中获取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在IIS Express 10上不使用websockets

我有带SignalR的.NET Core 2.2 + ASP.NET Core 2.2。在我的开发环境中,我具有带有IIS Express 10的Win7。

不幸的是,SignalR不使用WebSockets,不幸的是,我没有找到强迫它使用的方法。

在服务器端,SignalR的配置如下:

app.UseSignalR(
    routeBuilder => routeBuilder
        .MapHub<ClientsHub>(
            "/hubs/clients",
            options => options.Transports = HttpTransportType.WebSockets)
);
Run Code Online (Sandbox Code Playgroud)

在客户端配置是:

this._connection = new signalR.HubConnectionBuilder()
  .withUrl(this.api.getHubUrl(url), {
    transport: HttpTransportType.WebSockets
  })
  .build();
Run Code Online (Sandbox Code Playgroud)

来自SignalR客户端的协商请求结果如下:

{"connectionId":"1SyteS9TsDE5Q8LBRb2-VA","availableTransports":[]}
Run Code Online (Sandbox Code Playgroud)

结果,SignalR的客户端将此消息写入控制台:

Error: Failed to start the connection: Error: Unable to initialize any of the available transports.
Run Code Online (Sandbox Code Playgroud)

显然,这意味着未使用websocket,SignalR无法初始化websocket。

我发现使用Google时,IIS Express默认禁用了websocket,我必须先启用它们。我在文件applicationhost.config的IISExpress / config文件夹中找到了一些设置,并将其设置为Allow(默认为Deny):

<section name="webSocket" overrideModeDefault="Allow" />
Run Code Online (Sandbox Code Playgroud)

但是什么都没有改变。

如果要禁用协商,SignalR客户端将尝试通过url直接使用WebSockets,如下所示:

wss://localhost:44360/hubs/clients
Run Code Online (Sandbox Code Playgroud)

但是,此请求的结果是错误代码400:

Error during WebSocket handshake: Unexpected response code: 400
Run Code Online (Sandbox Code Playgroud)

是否有可能通过IIS 10强制SignalR使用WebSockets?还是要强制IIS 10允许SignalR使用WebSockets?

websocket iis-express .net-core asp.net-core-signalr

7
推荐指数
1
解决办法
112
查看次数

使用Autofac的ASP.NET Core v2.0的SignalR依赖注入

是否可以使用依赖注入将依赖注入到ASP.NET Core v2.0上的SignalR中?

假设以下集线器和依赖:

public MyHub : Hub {

    private readonly IMyDependency dependency;

    public MyHub(IMyDependency dependency) {
        this.dependency = dependency;
    }
}

public void MyDependency : IDependency
{
    public void MyMethod() {
        Console.WriteLine("I'm a dependency!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经浏览了一下网络,并没有任何明显的东西.我发现这个教程起初看起来很有希望,直到我意识到它Microsoft.AspNetCore.SignalR.Server最终没有发布.

目前,我使用Autofac进行以下设置,但它无法正常工作:

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 IServiceProvider …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection autofac asp.net-core asp.net-core-signalr

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

SignalR版本兼容性(StatusCode:405'方法不允许')

我正在处理我正在研究的S​​ignalR项目的问题.我正在尝试使用.Net Core构建服务器,使用传统的.Net(框架4.6.1)构建客户端.但是,服务器和客户端似乎不兼容.

我遇到的最后一个问题是StatusCode:405,ReasonPhrase:'Method Not Allowed'.我在GitHub上找到了一个答案,表明版本之间存在许多重大变化.

看看可用的NuGet包版本,我更加困惑.对于.Net Core服务器,我正在使用1.0.0-preview1-final.还有一个1.0.0-alpha2-final可用,但我不知道'alpha'是否比'preview'更新或更旧.

在客户端我使用的是2.2.2版本,并且有各种版本可供选择,我尝试了最旧和最新版本,但两个版本都给了我相同的"方法不允许"错误.

错误是在客户端,在服务器端,我的断点甚至没有被击中,所以它也可能是一个Owin/iis问题.

有没有可以映射SignalR客户端和服务器版本兼容性的图表?我想这将是向前迈出的一大步.

version signalr signalr-hub signalr.client asp.net-core-signalr

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

如果连接断开,如何正确处理客户端流?

我正在使用 Microsoft.AspNetCore.SignalR 2.1 v1.0.4,并且使用 v1.0.4 的打字稿客户端使用 ChannelReader 流。

频道显示特定于单个实体的事件数据,因此当客户端的用户导航到该单个实体的页面呈现数据时,预计客户端将订阅频道。如果用户导航到同一页面但针对不同的实体,则客户端将进行另一个订阅调用。

现在我的问题是关于如何最好地取消订阅流,以及一般来说,流的生命周期对于集线器连接停止/启动场景下的客户端来说是什么,以及服务器是否显式中止连接(由于 access_token 超时从而触发客户端刷新他们的连接)?

似乎没有从 api 中浮现出一些连接状态,所以我目前使用 RxJs Subject 将一些连接状态呈现给我的 UI 组件/服务,即当集线器连接的启动调用成功时,我浮现“真”,当onclose 回调称为 I 表面“假”。这允许我尝试在先前订阅的流上调用 dispose 以在连接断开/停止期间清理内容,然后在成功启动调用时再次调用订阅流。

我试过在一个流上调用 dispose 如果集线器已连接,这很好,但如果连接处于断开状态,它会出错。我想知道这是否是一个错误。即使集线器断开连接,我也应该能够处理流吗?

可以只做一个delete streamsubscription然后根据需要重新创建,还是会以任何方式泄漏?

asp.net-core-signalr system.threading.channels

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

信号器重试逻辑 .Net Core

我们在 Signalr .Net Core 中遇到了重新连接问题,重新连接到 signalr-hub 的最佳实践是什么?

以下似乎是有关重新连接的最受尊敬的文章。但似乎已经过时了,不是吗? 将 SignalR 2.0 .NET 客户端重新连接到服务器集线器的最佳实践

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

6
推荐指数
2
解决办法
4496
查看次数

信号器核心 (2.1) JWT 身份验证中心/协商 401 未经授权

所以我有一个 .net core (2.1) API,它使用 JWT 令牌进行身份验证。我可以登录并成功拨打经过身份验证的电话。

我正在为客户端使用 React (16.6.3),它获取 JWT 代码并对 API 进行经过身份验证的调用。

我正在尝试向站点添加信号集线器。如果我不在集线器类上放置 [Authorize] 属性。我可以连接、发送和接收消息(目前它是一个基本的聊天室)。

当我将 [Authorize] 属性添加到类时,React 应用程序会将 HttpPost 生成到example.com/hubs/chat/negotiate. 我会得到一个401状态码。在Authorization: Bearer abc.....头会向上传递。

要在 React 中构建集线器,我使用:

const hubConn = new signalR.HubConnectionBuilder()
            .withUrl(`${baseUrl}/hubs/chat`, { accessTokenFactory: () => jwt })
            .configureLogging(signalR.LogLevel.Information)
            .build();
Run Code Online (Sandbox Code Playgroud)

其中jwt变量是令牌。

我有一些身份验证设置:

services.AddAuthentication(a =>
{
    a.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    a.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.SaveToken = false;
    options.Audience = jwtAudience;

options.TokenValidationParameters = new TokenValidationParameters
{
    ValidateIssuer = true, …
Run Code Online (Sandbox Code Playgroud)

asp.net-core-signalr

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

SignalR:通知从 ASP.NET Core Web API 到 Angular 7 客户端的冗长操作的进度

编辑:见底部

我是 SignalR 的新手,并尝试使用这个库和 ASP.NET Core Web API 用 Angular7 客户端实现一个简单的场景。我所需要的只是使用 SignalR 来通知客户端 API 控制器方法中一些冗长操作的进度。

经过多次尝试,我达到了显然已建立连接的程度,但是当长任务开始运行并发送消息时,我的客户端似乎没有收到任何内容,网络套接字中也没有出现任何流量(Chrome F12 -网络 - WS)。

我在这里发布了详细信息,这可能对其他新手也有用(完整源代码位于https://1drv.ms/u/s!AsHCfliT740PkZh4cHY3r7I8f-VQiQ)。可能我只是犯了一些明显的错误,但在文档和谷歌搜索中我找不到与我的代码片段完全不同的代码片段。谁能给个提示?

服务器端我的起点是https://msdn.microsoft.com/en-us/magazine/mt846469.aspx,加上文档在https://docs.microsoft.com/en-us/aspnet/core/ signalr/hubs?view=aspnetcore-2.2。我试图用它创建一个虚拟的实验解决方案。

我以食谱形式的代码片段如下。

(A) 服务器端

1.创建一个新的 ASP.NET 核心 Web API 应用程序。没有身份验证或 Docker,只是为了保持最小化。

2.添加NuGet包Microsoft.AspNetCore.SignalR

3.在Startup.csConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    // CORS
    services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
    {
        builder.AllowAnyMethod()
            .AllowAnyHeader()
            // https://github.com/aspnet/SignalR/issues/2110 for AllowCredentials
            .AllowCredentials()
            .WithOrigins("http://localhost:4200");
    }));
    // SignalR
    services.AddSignalR();
    
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Run Code Online (Sandbox Code Playgroud)

以及相应的Configure方法: …

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

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

SignalR C# 客户端 Hubconnection.On 未触发

我有一个 ASPNet.Core WebApi,带有 signalR。我有 Angular 应用程序,它使用 webAPI,我想将其替换为 Blazor Web assembly 应用程序。我在 Blazor 应用程序中遇到 signalR 问题。

我创建了一个 hubconnection,对其进行设置,当服务器发送数据时,不会调用 Hubconnection.On 方法。这是我的代码:

protected override async Task OnInitializedAsync()
{
    _hubConnection = new HubConnectionBuilder()
        .WithUrl("https://localhost:45299/hubs/accounthub", cfg =>
        {
            cfg.SkipNegotiation = true;
            cfg.AccessTokenProvider = () => Task.FromResult(token);
            cfg.Transports = HttpTransportType.WebSockets;
        })
        .Build();

    _hubConnection.On<IEnumerable<AccountResponse>>("accountschanged", (accounts) =>
    {
        foreach(var account in accounts)
        {
            Console.WriteLine(account.Name);
        }
    });
    await _hubConnection.StartAsync();
}
Run Code Online (Sandbox Code Playgroud)

在网络选项卡中,我看到连接正常,我收到新数据,但 hubconnection.On 中的方法不会被触发。我仔细检查了方法名称,它是相同的。在角度应用程序中,它工作正常,并且当数据从服务器发送时,我不认为服务器代码有任何问题。

我使用 Fluxor 进行状态管理,并在“On”方法中触发一个操作,为了简单起见,我只是用一个 Console.WriteLine 替换了它。

编辑:添加服务器代码,并收到消息这是服务器代码,当帐户更改时会调用“AccountsChanged”:

public class AccountHub : Hub, IAccountHub
{
    private readonly IHubContext<AccountHub> …
Run Code Online (Sandbox Code Playgroud)

c# signalr.client asp.net-core-signalr blazor-webassembly

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

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
查看次数