Change Global Settings Config in SignalR Core

2020-03-24 03:50发布

I am using SignalR Core with ASP.Net Core.

I want to override GlobalHost settings for signalR.

I am getting this-

protected void Application_Start(object sender, EventArgs e)
{
    // Make long polling connections wait a maximum of 110 seconds for a
    // response. When that time expires, trigger a timeout command and
    // make the client reconnect.
    GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);

    // Wait a maximum of 30 seconds after a transport connection is lost
    // before raising the Disconnected event to terminate the SignalR connection.
    GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);

    // For transports other than long polling, send a keepalive packet every
    // 10 seconds. 
    // This value must be no more than 1/3 of the DisconnectTimeout value.
    GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);

    RouteTable.Routes.MapHubs();
}

But I can't configure it with my application.

It is on ASP.Net Core v1.0.

My Startup.cs is like this-

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace McpSmyrilLine
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();

            if (env.IsDevelopment())
            {
                // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
                builder.AddApplicationInsightsSettings(developerMode: true);
            }
            Configuration = builder.Build();

        }

        public IConfigurationRoot Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddApplicationInsightsTelemetry(Configuration);
            //Add DB Context
            var connectionStringBuilder = new Microsoft.Data.Sqlite.SqliteConnectionStringBuilder { DataSource = "mcp.db" };
            var connectionString = connectionStringBuilder.ToString();

            ///////////////Add Cors
            var corsBuilder = new CorsPolicyBuilder();
            corsBuilder.AllowAnyHeader();
            corsBuilder.AllowAnyMethod();
            corsBuilder.AllowAnyOrigin();
            corsBuilder.AllowCredentials();

            services.AddCors(options =>
            {
                options.AddPolicy("AllowAll", corsBuilder.Build());
            });
            ///////////////End Cors

            services.AddDbContext<McpDbContext>(options =>
                options.UseSqlite(connectionString));

            services.AddMvc();
            services.AddSignalR(options => { options.Hubs.EnableDetailedErrors = true; });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            //Configure Cors
            app.UseCors("AllowAll");

            app.UseSignalR();

            app.UseApplicationInsightsRequestTelemetry();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
                //Adding Seeder Data
                AddTestData(app.ApplicationServices.GetService<McpDbContext>());
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseApplicationInsightsExceptionTelemetry();

            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

        private static void AddTestData(McpDbContext context)
        {
            //var testUser1 = new DbModels.Try.User
            //{
            //    Id = "abc123",
            //    FirstName = "Luke",
            //    LastName = "Skywalker"
            //};

            //context.Users.Add(testUser1);

            //var testPost1 = new DbModels.Try.Post
            //{
            //    Id = "def234",
            //    UserId = testUser1.Id,
            //    Content = "What a piece of junk!"
            //};

            //context.Posts.Add(testPost1);

            //context.SaveChanges();
        }
    }
}

Can anyone please help?

1条回答
\"骚年 ilove
2楼-- · 2020-03-24 04:35

There's a Transports property in SignalROptions
You can setup the SignalR middleware like this :

services.AddSignalR(options => {
                options.Hubs.EnableDetailedErrors = true;
                var transports = options.Transports;
                transports.DisconnectTimeout = TimeSpan.FromSeconds(30);
                transports.KeepAlive = TimeSpan.FromSeconds(10);
                transports.TransportConnectTimeout = TimeSpan.FromSeconds(110);
            });

UPDATE alpha2-final

Transport options can be configured throught MapHub:

app.UseSignalR(configure =>
{
    configure.MapHub<Hub>("hub", options => 
    {
        options.Transports = TransportType.All;
        options.LongPolling.PollTimeout = TimeSpan.FromSeconds(10);
        options.WebSockets.CloseTimeout = TimeSpan.FromSeconds(10);
    });
})

and on client side:

let logger: ILogger;
let transportType: TransportType;
const hubConnetion = new HubConnection(
  new HttpConnection(
      url,
      { 
        transport: transportType,
        logging: logger
      }));
查看更多
登录 后发表回答