在 .NET Core 3.1 控制台中托管 SignalR 中心



我将一个由exe托管的旧.NET库从.NET Framework 4.6迁移到.NET Core 3.1。程序集的一部分基于像这样实现的独立 SignalR 中心。

//-----------------------------------
// Startup SignalR Server
//-----------------------------------
m_oSignalRServer = WebApp.Start( C_AppSettings.ServerURL );

我知道主机必须以IHostBuilderHost.CreateDefaultBuilder启动,但我真的不明白如何配置它。特别是,如何指定绑定和集线器名称。

欢迎示例代码或书籍。

learn.microsoft.com

public static IHostBuilder CreateHostBuilder( string [ ] args ) =>
Host.CreateDefaultBuilder( args ).ConfigureServices( ( hostContext, services ) =>
{
services.AddSignalR( ( hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes( 1 );
} ));
} );

提前感谢!

这就是我所做的,它对我来说使用 .NET Core 3.1 控制台应用程序工作正常。 打开您的 .csproj 并向其添加以下内容:

<ItemGroup>
<FrameworkReference Include="Microsoft.aspNetCore.App" />
</ItemGroup>

然后通过 NuGet 包管理器添加以下包:

Microsoft.AspNetCore.SignalR

这是我的基本程序.cs:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace GameServer
{
internal class Program
{
private static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
private static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
}
}

和一个基本的启动.cs:

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace GameServer
{
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration) { Configuration = configuration; }
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
}
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chat");
});
}
}
}

IMO希望它对:)有所帮助,简单得多

我试图更详细地解释我的问题,并希望有人知道如何解决问题。 Microsoft建议使用Host.CreateDefaultBuilder而不是WebHost.CreateDefaultBuilder,正如我所理解的那样。Host.CreateDefaultBuilder 从 json 文件中读取配置。问题是我不明白如何连接呼叫服务。AddSignalR() 到我的集线器。

在我的旧.NET 4.5版本中,从我的角度来看,这更容易。 服务器是使用此代码启动的

IDisposable oSignalRServer = WebApp.Start( "http://localhost:3211" );

并且集线器被引用

ConnectionManager.GetHubContext<C_IOHub>()

中心定义

[HubName( "IOHub" )]
public class C_IOHub : Hub

但是对于.NET Core,我迷失了如何将其构建为独立服务器。我找到的所有示例都描述了如何将集线器附加到现有的 MVC 项目。 我有一个启动.cs具有以下代码:

public static void Main( string [ ] args )
{
CreateHostBuilder( args ).Build().Run();
}
public static IHostBuilder CreateHostBuilder( string [ ] args ) =>
Host.CreateDefaultBuilder( args )
.ConfigureServices( ( hostContext, services ) =>
{
services.AddSignalR();
} );

我需要以下信息

  1. 如何在 .NET Core 中创建独立中心?

  2. 如何获取对中心上下文的引用?

按照在 .NET Core 3.1 应用中创建和使用中心的完整示例进行操作:

  • 首先从appsettings.json读取配置
"Azure": {
"SignalR": {
"ClientTimeoutInterval": 3600,
"HandshakeTimeout": 30,
"KeepAliveInterval": 15,
"EnableDetailedErrors": true,
"MaximumReceiveMessageSize": 32000,
"StreamBufferCapacity": 10,
"SupportedProtocols": [ "WebSockets", "ServerSentEvents" ],
"ServerConnectionCount": 1
}
}
  • 然后在启动时阅读配置
private AzureConfiguration azureConfiguration;
  • 添加到配置方法
services.Configure<AzureConfiguration>(this.Configuration.GetSection(Azure)).AddOptionsSnapshot<Azure>();

注意:您可以像这样解析配置this.azureConfiguration = provider.GetRequiredService<AzureConfiguration>();

  • 在启动时,配置方法:
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<YourHub>(this.azureConfiguration.SignalR.Endpoint)
});
  • 在配置服务方法上:
services.AddSignalR(hubOptions =>
{
hubOptions.ClientTimeoutInterval = TimeSpan.FromSeconds(this.azureConfiguration.SignalR.ClientTimeoutInterval);
hubOptions.HandshakeTimeout = TimeSpan.FromSeconds(this.azureConfiguration.SignalR.HandshakeTimeout);
hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(this.azureConfiguration.SignalR.KeepAliveInterval);
hubOptions.EnableDetailedErrors = this.azureConfiguration.SignalR.EnableDetailedErrors;
hubOptions.MaximumReceiveMessageSize = this.azureConfiguration.SignalR.MaximumReceiveMessageSize;
hubOptions.StreamBufferCapacity = this.azureConfiguration.SignalR.StreamBufferCapacity;
});

因此,您在启动时的配置已完成,现在只需创建您的中心即可。 创建集线器后,可以使用 DI 将其注入控制器、工作线程等...喜欢:

private IHubContext<YourHub, IYourHub> YourHub
{
get
{
return this.serviceProvider.GetRequiredService<IHubContext<YourHub, IYourHub>>();
}
}

PS:您应该在添加集线器方法之前配置CORS

services.AddCors(options =>
{
options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("http://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed((host) => true));
});

相关内容

  • 没有找到相关文章

最新更新