2017-04-26 14 views
0

我在我们的应用程序中集成了SignalR,它一直工作得很好。 几天前,由于某些要求,我们必须支持扩展应用程序 - 因此我们选择使用Redis进行SignalR扩展。使用SignalR改善多个Web实例的扩展性能Redis Backplane

但是,自整合以来,SignalR本身已停止工作,而我们得到的错误是:NO TRANSPORT无法成功初始化。尝试指定一个不同的传输或根本不用于自动初始化。应用

途径: - 不同版本的SignalR的尝试,网上建议 - 没有帮助 - 增加连接超时 - 没有帮助

需要解决此提供一些帮助。建议使用任何其他方法也是受欢迎的。

[UPDATE1]添加代码片段

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
    // Any connection or hub wire up and configuration should go here 
    GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName"); 
    app.MapSignalR(); 
    } 
} 

更多的参考,我跟着这个链接:https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-with-redis

[UPDATE2]

public void Configuration(IAppBuilder app) 
{ 
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110); 
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30); 
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10); 
GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromSeconds(45); 

ConfigureAuth(app); 
ConfigureSignalR(app); 

// SignalR backplane code changes 
string server = RoleEnvironment.IsAvailable ? 
         RoleEnvironment.GetConfigurationSettingValue(Constant.ConfigKeys.RedisCacheEndpoint) : 
         ConfigurationManager.AppSettings[Constant.ConfigKeys.RedisCacheEndpoint]; 
string port = RoleEnvironment.IsAvailable ? 
         RoleEnvironment.GetConfigurationSettingValue(Constant.ConfigKeys.RedisCachePort) : 
         ConfigurationManager.AppSettings[Constant.ConfigKeys.RedisCachePort]; 
string password = RoleEnvironment.IsAvailable ? 
          RoleEnvironment.GetConfigurationSettingValue(Constant.ConfigKeys.RedisCachePassword) : 
          ConfigurationManager.AppSettings[Constant.ConfigKeys.RedisCachePassword]; 

const string SIGNALR_REDIS_APPNAME = "Phoenix 2.0 Admin Tool"; 
string connectionString = server + ":" + Int32.Parse(port) + ";password=" + password + ",ssl=True,abortConnect=False"; 
RedisScaleoutConfiguration cfg = new RedisScaleoutConfiguration(connectionString, SIGNALR_REDIS_APPNAME); 
GlobalHost.DependencyResolver.UseRedis(cfg); 
app.MapSignalR(); 
} 
+0

可以显示用于连接到SignalR的客户端代码吗?你如何扩大规模?您是否在一台IIS服务器上安装了ARR,以便为应用程序服务器配置Web农民? – Alisson

+0

@Alisson - 在问题 – mitraark

+0

中内联添加了代码段**新发现** - 它在Premis Redis服务器上运行,而不是在Azure Redis缓存中运行。假设问题可能出现在身份验证中。任何想法? – mitraark

回答

0

我们有一个Azure的AppService服务并且能够使用SignalR w/Redis背板。根据连接字符串的内容,我确实发现事情无法正常工作。我们使用了GlobalHost.DependencyResolver.UseRedis API的RedisScaleoutConfiguration超载,而不是使用您显示的超载。

这是基于我们的工作启动代码块(值改为保护弱势群体):

const string SIGNALR_REDIS_APPNAME = "OurAppName"; 
string connectionString = "thename.redis.cache.windows.net:6380;password=somelongsecret,ssl=True,abortConnect=False"; 
RedisScaleoutConfiguration cfg = new RedisScaleoutConfiguration(connectionString, SIGNALR_REDIS_APPNAME); 
GlobalHost.DependencyResolver.UseRedis(cfg); 

很明显,你可以从web.config实际的连接字符串与更多的代码。在指定非默认数据库名称时,我们也遇到了麻烦,因此在这里使用默认值。

希望这会有所帮助。

+0

尝试过。失败,出现同样的错误。 :( – mitraark

+0

增加了有问题的代码 – mitraark

+0

我可能错过了某些东西你正在内部运行还是在云中运行?如果云在Azure AppService或CloudService中运行?如果Azure应用程序服务在应用程序的*上开启了WebSockets *设置?Redis是在本地运行还是在云中运行? –