Объединительная плата SignalR Redis не работает - проблема с зависимостями?
Мы используем SignalR с объединительной платой Redis (кэш Azure) в нашем избыточном веб-приложении 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 находится в другой сборке, чем веб-хостинг.
Я не получаю никаких исключений в приложении iself, но я получаю следующую ошибку при трассировке SignalR:
SignalR.ReflectedHubDescriptorProvider Предупреждение: 0: некоторые классы из сборки "Microsoft.AspNet.SignalR.Owin, Version=1.2.2.0, Culture= нейтральный, PublicKeyToken=31bf3856ad364e35" не могут быть загружены при поиске концентраторов. [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ Временный 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" />
Очень благодарен за вашу помощь!
2 ответа
Я нашел проблему:-) Поскольку мы используем OWIN, ничего не должно быть зарегистрировано через GlobalHost
, Вот рабочее решение:
var hubConfiguration = new HubConfiguration
{
Resolver = new AutofacDependencyResolver(resolver)
};
app.UseAutofacMiddleware(resolver);
app.MapSignalR("/signalr", hubConfiguration);
hubConfiguration.Resolver.UseRedis(new RedisScaleoutConfiguration(redisConnectionString, signalrRedisKey));
В одном из моих проектов я использовал signalR с Ninject в качестве средства разрешения зависимостей. Там, в 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
(в классах провайдера масштабирования, который устанавливает, какой провайдер масштабирования использовать во время выполнения)