我们在冗余的Azure网络应用程序中使用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,版本= 1.2.2.0, Culture = neutral,PublicKeyToken = 31bf3856ad364e35"无法加载 搜索中心时。 [C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET
文件\根\ 79fa3057 \ a44a64e \组件\ DL3 \ 75de3633 \ cfc73faf_eb21d101 \ Microsoft.AspNet.SignalR.Owin.dll]
原始异常类型:ReflectionTypeLoadException原始 异常消息:无法加载一个或多个请求的类型。 检索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" />
非常感谢你的帮助!
答案 0 :(得分:8)
我发现了问题:-)因为我们正在使用OWIN,所以不应该通过GlobalHost
注册。这是工作解决方案:
var hubConfiguration = new HubConfiguration
{
Resolver = new AutofacDependencyResolver(resolver)
};
app.UseAutofacMiddleware(resolver);
app.MapSignalR("/signalr", hubConfiguration);
hubConfiguration.Resolver.UseRedis(new RedisScaleoutConfiguration(redisConnectionString, signalrRedisKey));
答案 1 :(得分:1)
在我的一个项目中,我使用SignalR和Ninject作为依赖解析器。我在hubConfiguration中提到使用Ninject作为依赖项解析器,在分配之后,hubConfiguration.Resolver被分配给GlobalHost.DependencyResolver。 e.g。
app.Map("/hubUrl", map =>
{
var hubConfiguration = new HubConfiguration
{
EnableJavaScriptProxies = false,
Resolver = InitializeNinjectDepenedencyResolver()
};
GlobalHost.DependencyResolver = hubConfiguration.Resolver;
map.RunSignalR(hubConfiguration);
}
这样可以确保我能够使用GlobalHost.DependencyResolver
在其他地方使用相同的依赖项解析器(在Scaleout提供程序类中设置在运行时使用哪个scaleout提供程序)