gpt4 book ai didi

asp.net-core - 让 SignalR IConnectionManager GetHubContext 在 aspnet 核心的 Startup.cs 中工作

转载 作者:行者123 更新时间:2023-12-04 02:09:35 25 4
gpt4 key购买 nike

我似乎无法使用以下代码。我所做的一切都在 ConfigureServies打电话_serviceProvider.GetService<IConnectionManager>();并将其保存在静态字段中,稍后尝试使用它来访问 IConnectionManager随后调用 GetHubContext<MyHub>这样我就可以向所有连接的客户端广播消息。

_connectionManager.GetHubContext<MyHub>().Clients.All.doSomethingOnClients();

作为测试,webapi Controller 操作方法中的同一行代码工作正常! (通过构造函数注入(inject) IConnectionManager)。这让我相信我的信号器设置很好,只是我在启动类中得到东西的方式在某处是错误的。 GetHashCodeIConnectionManager 上在启动时,我的 Controller 给出了不同的哈希码。我只需要在 ApplicationLifetime OnStartUp 上 Hook ...

你能帮我了解哪里出了问题吗?

public class Startup
{
public static IServiceProvider _serviceProvider;
public static IConnectionManager _connectionManager;
private readonly IHostingEnvironment _hostingEnv;
public IConfigurationRoot Configuration { get; }

public Startup (IHostingEnvironment env)
{
// ...
}
public void ConfigureServices (IServiceCollection services)
{
// ....
services.AddSignalR(options => {
options.Hubs.EnableDetailedErrors = true;
});

services.AddMvc();
// ...
_serviceProvider = services.BuildServiceProvider();
_connectionManager = _serviceProvider.GetService<IConnectionManager>();
}

public void Configure (IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime applicationLifetime)
{
// ...
applicationLifetime.ApplicationStarted.Register(OnStartUp);
// ...
app.UseMvc(routes => {
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
app.UseSignalR();
// ...
}

public void OnStartUp ()
{
var x = _serviceProvider.GetService<MySingletonObject>();
// MySingletonObject has a VersionUpdated event handler
x.VersionUpdated += OnUpdate;
}

private void OnUpdate (object sender, EventArgs e)
{

// I get here everytime my singleton gets updated fine!
// but the following does not work
_connectionManager.GetHubContext<MyHub>().Clients.All.doSomethingOnClients();
}

}

我正在使用“Microsoft.AspNetCore.SignalR.Server/0.2.0-alpha1-22362”。

最佳答案

第一件事是意识到这个版本的 SignalR 没有发布,它只是 alpha。您遇到的问题是因为您正在构建 2 个服务提供者并且他们没有相互交谈。您调用 BuildServiceProvider() 而不是将 IConnectionManager 注入(inject)到您的 Configure 方法中。您还可以通过将依赖项直接注入(inject)配置然后在回调中使用它们来清理大量服务定位器模式。

public class Startup
{
public IConfigurationRoot Configuration { get; }

public Startup (IHostingEnvironment env)
{
// ...
}

public void ConfigureServices (IServiceCollection services)
{
// ....
services.AddSignalR(options => {
options.Hubs.EnableDetailedErrors = true;
});

services.AddMvc();
// ...
}

public void Configure (IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory,
IApplicationLifetime applicationLifetime,
MySingletonObject obj,
IHubContext<MyHub> context)
{
// ...
applicationLifetime.ApplicationStarted.Register(() => OnStartUp(obj, context));
// ...
app.UseMvc(routes => {
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
app.UseSignalR();
// ...
}

public void OnStartUp(MySingletonObject obj, IHubContext<MyHub> context)
{
// MySingletonObject has a VersionUpdated event handler
obj.VersionUpdated += (sender, e) =>
{
context.Clients.All.doSomethingOnClients();
};
}

}

更干净的是另一种服务,它可以组合所有内容,因此您最终不会在启动方法中有这么多参数。

关于asp.net-core - 让 SignalR IConnectionManager GetHubContext 在 aspnet 核心的 Startup.cs 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39970280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com