Тайм-аут рукопожатия SignalR на IIS - PullRequest
0 голосов
/ 06 декабря 2018

Среда:

  • IIS 7.0 в Windows 7 Home
  • WebService, написанный на ядре asp.net 2.1
  • WebClient, написанный на Angular
  • Последняя библиотека signalR (.NET Core и JS)

Проблема:

  • Запрос на квитирование не выполнен из-за тайм-аута 15 с.Единственный ответ от сервера No Connection with that ID.Но иногда он подключается через 4 мс, что совершенно странно (задержка 10 с между повторными подключениями).

Дополнительная информация:

  • IIS isтакже доступен извне (скажем, www.myapp.domain.com:88/application, сигнальный концентратор: www.myapp.domain.com:88/application/appHub), но, похоже, это неактуально, поскольку проблема возникает также при использовании только внутренних IP-адресов.
  • В IIS любой другой запрос работает правильнои быстро, единственная проблема связана с соединениями signalR.
  • Из-за отказа он использует SSE.
  • В среде разработки (kestrel) все работает нормально.
  • Каждый брандмауэр и т. д.

.Net Core:

public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>
        {
            builder.AllowAnyHeader()
                .AllowAnyMethod()
                .AllowAnyOrigin()
                .AllowCredentials();
        }));
        services.AddSignalR(hubOptions =>
        {
            hubOptions.EnableDetailedErrors = true;
            hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(10);
            hubOptions.HandshakeTimeout = TimeSpan.FromSeconds(5);
        });
        services.AddMvc(options =>
            {
                options.Filters.Add(new ProducesAttribute("application/json"));
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddControllersAsServices();
        services.AddAuthentication(Configuration);
        services.AddAuthorizationPolicies();

        return ServiceProviderFactory.CreateAutofacServiceProvider(services, Configuration);
    }

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseCors("CorsPolicy");
        app.UseAuthentication();
        app.UseExceptionHandler(env);
        app.UseWebSockets();
        app.UseHubs();
        app.UseMvc();
    }

JS:

private buildConnection() {
    const connectionBuilder = new HubConnectionBuilder();
    this.hubConnection = connectionBuilder
        .withUrl(environment.hubUrl, { accessTokenFactory: () => this.accessToken() })
        .configureLogging(LogLevel.Trace)
        .build();
}

(чувствительныйданные удалены) enter image description here

...