SignalR Redis 背板不工作 - 依赖性问题?
SignalR Redis backplane not working - dependency issue?
我们在冗余的 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 Warning: 0 : Some of the
classes from assembly "Microsoft.AspNet.SignalR.Owin, Version=1.2.2.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35" could Not be loaded
when searching for Hubs.
[C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET
Files\rootfa3057\a44a64e\assembly\dl3de3633\cfc73faf_eb21d101\Microsoft.AspNet.SignalR.Owin.dll]
Original exception type: ReflectionTypeLoadException Original
exception message: Unable to load one or more of the requested types.
Retrieve the LoaderExceptions property for more information.
是否是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));
在我的一个项目中,我使用了带有 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 提供程序 类 中,它设置了在 运行 时间使用的扩展提供程序)
我们在冗余的 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 Warning: 0 : Some of the classes from assembly "Microsoft.AspNet.SignalR.Owin, Version=1.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" could Not be loaded when searching for Hubs. [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET
Files\rootfa3057\a44a64e\assembly\dl3de3633\cfc73faf_eb21d101\Microsoft.AspNet.SignalR.Owin.dll]
Original exception type: ReflectionTypeLoadException Original exception message: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
是否是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));
在我的一个项目中,我使用了带有 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 提供程序 类 中,它设置了在 运行 时间使用的扩展提供程序)