C# 信号器Redis背板不工作-相关性问题?
在我们的冗余Azure web应用程序中,我们将Signal与Redis(Azure缓存)背板一起使用。几天前,我们检测到所有信号器消息似乎都没有被传递(它在过去工作过),因此指出了背板的问题 该应用程序使用ASP.Net Owin启动以及Autofac作为集线器的IoC,我们启动Signal如下:C# 信号器Redis背板不工作-相关性问题?,c#,signalr,signalr-backplane,C#,Signalr,Signalr Backplane,在我们的冗余Azure web应用程序中,我们将Signal与Redis(Azure缓存)背板一起使用。几天前,我们检测到所有信号器消息似乎都没有被传递(它在过去工作过),因此指出了背板的问题 该应用程序使用ASP.Net Owin启动以及Autofac作为集线器的IoC,我们启动Signal如下: GlobalHost.DependencyResolver.UseRedis(new RedisScaleoutConfiguration(redisConnectionString, signal
GlobalHost.DependencyResolver.UseRedis(new RedisScaleoutConfiguration(redisConnectionString, signalrRedisKey));
var hubConfiguration = new HubConfiguration
{
Resolver = new AutofacDependencyResolver(resolver)
};
app.UseAutofacMiddleware(resolver);
app.MapSignalR("/signalr", hubConfiguration);
如果我将Redis背板配置字符串更改为无效字符串,这无关紧要,它只是无法连接。信号机代码位于web主机以外的另一个组件中
我在应用程序iself中没有得到任何异常,但在跟踪信号器时得到以下错误:
SignalR.ReflectedHubDescriptor提供程序警告:0:某些
来自程序集“Microsoft.AspNet.SignalR.Owin,Version=1.2.2.0”的类,
无法加载区域性=中性,PublicKeyToken=31bf3856ad364e35”
搜索集线器时。
[C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET
Files\root\79fa3057\a44a64e\assembly\dl3\75de3633\cfc73faf_eb21d101\Microsoft.AspNet.signal.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" />
非常感谢你的帮助 我发现了问题:-)因为我们正在使用OWIN,所以不应该通过GlobalHost
注册任何内容。以下是工作解决方案:
var hubConfiguration = new HubConfiguration
{
Resolver = new AutofacDependencyResolver(resolver)
};
app.UseAutofacMiddleware(resolver);
app.MapSignalR("/signalr", hubConfiguration);
hubConfiguration.Resolver.UseRedis(new RedisScaleoutConfiguration(redisConnectionString, signalrRedisKey));
在我的一个项目中,我使用了signer和Ninject作为依赖项解析程序。在hubConfiguration中,我提到过使用Ninject作为依赖项解析程序,在分配了Ninject之后,hubConfiguration.resolver被分配给GlobalHost.dependencysolver。e、 g
app.Map("/hubUrl", map =>
{
var hubConfiguration = new HubConfiguration
{
EnableJavaScriptProxies = false,
Resolver = InitializeNinjectDepenedencyResolver()
};
GlobalHost.DependencyResolver = hubConfiguration.Resolver;
map.RunSignalR(hubConfiguration);
}
通过这种方式,它确保了我能够在其他地方使用相同的依赖项解析器,使用
GlobalHost.DependencyResolver
(在设置在运行时使用哪个扩展提供程序的扩展提供程序类中)感谢分享!