【问题标题】:SignalR Redis backplane not working - dependency issue?SignalR Redis 背板不工作 - 依赖问题?
【发布时间】:2016-05-21 09:56:56
【问题描述】:

我们在冗余 Azure Web 应用程序中使用 SignalR 和 Redis(Azure 缓存)背板。几天前我们检测到所有 SignalR 消息似乎都没有送达(过去一直有效),因此表明背板有问题。

应用程序使用 ASP.Net Owin 启动以及 Autofac 作为集线器的 IoC,我们像这样启动 SignalR:

GlobalHost.DependencyResolver.UseRedis(new RedisScaleoutConfiguration(redisConnectionString, signalrRedisKey));
var hubConfiguration = new HubConfiguration
{
    Resolver = new AutofacDependencyResolver(resolver)
};
app.UseAutofacMiddleware(resolver);
app.MapSignalR("/signalr", hubConfiguration);

如果我将 Redis 背板配置字符串更改为无效的内容也没关系,它只是无法连接。 SignalR 代码位于 Web 主机之外的另一个程序集中。

我的应用程序本身没有任何异常,但是在跟踪 SignalR 时出现以下错误:

SignalR.ReflectedHubDescriptorProvider 警告:0:一些 来自程序集“Microsoft.AspNet.SignalR.Owin, Version=1.2.2.0, 文化=中性,PublicKeyToken=31bf3856ad364e35" 无法加载 搜索集线器时。 [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET

文件\root\79fa3057\a44a64e\assembly\dl3\75de3633\cfc73faf_eb21d101\Microsoft.AspNet.SignalR.Owin.dll]

原始异常类型:ReflectionTypeLoadException Original 异常消息:无法加载一种或多种请求的类型。 检索 LoaderExceptions 属性以获取更多信息。

是nuget的依赖问题吗?

以下是我们的 packages.config 的相关摘录:

<package id="Autofac" version="3.5.2" targetFramework="net46" />
<package id="Autofac.Owin" version="3.1.0" targetFramework="net46" />
<package id="Autofac.SignalR" version="3.0.2" targetFramework="net46" />
<package id="Castle.Core" version="3.3.3" targetFramework="net46" />
<package id="Microsoft.AspNet.SignalR.Client" version="2.2.0" targetFramework="net46" />
<package id="Microsoft.AspNet.SignalR.Core" version="2.2.0" targetFramework="net46" />
<package id="Microsoft.AspNet.SignalR.Redis" version="2.2.0" targetFramework="net46" />
<package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" />
<package id="Microsoft.Owin.Security" version="3.0.1" targetFramework="net46" />
<package id="Newtonsoft.Json" version="8.0.2" targetFramework="net46" />
<package id="Owin" version="1.0" targetFramework="net46" />
<package id="StackExchange.Redis.StrongName" version="1.0.488" targetFramework="net46" />

非常感谢您的帮助!

【问题讨论】:

    标签: c# signalr signalr-backplane


    【解决方案1】:

    我发现了问题 :-) 由于我们使用的是 OWIN,因此不应通过 GlobalHost 注册任何内容。这是可行的解决方案:

    var hubConfiguration = new HubConfiguration
    {
        Resolver = new AutofacDependencyResolver(resolver)
    };
    app.UseAutofacMiddleware(resolver);
    app.MapSignalR("/signalr", hubConfiguration);
    
    hubConfiguration.Resolver.UseRedis(new RedisScaleoutConfiguration(redisConnectionString, signalrRedisKey));
    

    【讨论】:

    • 感谢分享!
    【解决方案2】:

    在我的一个项目中,我使用了带有 Ninject 的 signalR 作为依赖解析器。在 hubConfiguration 中,我曾提到使用 Ninject 作为依赖解析器,然后分配,hubConfiguration.Resolver 被分配给 GlobalHost.DependencyResolver。例如

    app.Map("/hubUrl", map =>
    {
         var hubConfiguration = new HubConfiguration
                    {
                        EnableJavaScriptProxies = false,
                        Resolver = InitializeNinjectDepenedencyResolver()
                    };
         GlobalHost.DependencyResolver = hubConfiguration.Resolver;
         map.RunSignalR(hubConfiguration);
    }
    

    这样可以确保我能够在其他地方使用 GlobalHost.DependencyResolver 使用相同的依赖解析器(在设置运行时使用的扩展提供程序的 Scaleout 提供程序类中)

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 2021-07-13
      • 2019-11-28
      • 2020-04-30
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 2015-12-14
      相关资源
      最近更新 更多