Разместите концентратор SignalR в консоли. NET Core 3.1 - PullRequest
0 голосов
/ 26 февраля 2020

Я мигрирую старую. NET библиотеку, размещенную в exe, из. NET Framework 4.6 в. NET Core 3.1. Часть сборки основана на отдельном концентраторе SignalR, реализованном следующим образом.

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

Я понял, что хост должен быть запущен с IHostBuilder и Host.CreateDefaultBuilder, но я действительно не понимаю, как его настроить. И особенно, как мне указать привязки и имена узлов.

Пример кода или книги приветствуются.

docs.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 );
    } ));
} );

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Ниже приводится полный пример создания и использования концентратора в приложении. NET Core 3.1:

  • Сначала прочитайте конфигурацию из настроек приложения. 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;
});

Итак, ваша конфигурация при запуске завершена, теперь просто go создайте концентратор. После создания концентратора его можно вставить с помощью DI в контроллеры, рабочие и т. Д. c ... например:

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));
});
0 голосов
/ 28 февраля 2020

Я пытаюсь объяснить мою проблему более подробно и надеюсь, что кто-то знает, как решить проблему. 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 I Я потерял, как построить это как отдельный сервер. Все примеры, которые я нашел, описывают, как подключить концентратор к существующему проекту MVC. У меня есть файл Startup.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. Как получить ссылку на контекст Hub?

...