Change Global Settings Config in SignalR Core

对着背影说爱祢 提交于 2019-12-19 08:32:22

问题


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:


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


来源:https://stackoverflow.com/questions/39220093/change-global-settings-config-in-signalr-core

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!