次のような状況があります: Autofac を依存関係リゾルバーとして使用する SignalR アプリケーションがあります。
public class Startup
{
public void Configuration(IAppBuilder app)
{
var container = new AutofacContainer().Container;
var resolver = new AutofacDependencyResolver(container);
resolver.UseRedis("serverIp", portNumber, "password", "channelName");
app.UseAutofacMiddleware(container);
app.MapSignalR(new HubConfiguration
{
Resolver = resolver
});
resolver.UseRedis("192.168.122.213", 6300, "", "FLEDGG");
AddSignalRInjection(container, resolver);
}
private void AddSignalRInjection(IContainer container,IDependencyResolver resolver)
{
var updater = new ContainerBuilder();
updater.RegisterInstance(resolver.Resolve<IConnectionManager>());
updater.Update(container);
}
}
そして、これがAutofacContainer
クラスです。
public class AutofacContainer
{
public IContainer Container { get; set; }
public AutofacContainer()
{
var builder = new ContainerBuilder();
builder.RegisterHubs(Assembly.GetExecutingAssembly())
.PropertiesAutowired();
builder.RegisterType<Test>()
.As<ITest>()
.PropertiesAutowired();
Container = builder.Build();
}
}
現在、Microsoft の公式の SignalR Redis スケールアウト ドキュメントGlobalHost.DependencyResolver
には、 to に通知する必要があると記載されていUseRedis
ます。
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
app.MapSignalR();
}
GlobalHost
私はアプリケーションでもう使用していないので(使用してもGlobalHost
Redis にはまったく動作がありません) ( Autofac と SignalR および Owin の統合が示すように):
OWIN 統合でよくあるエラーは、GlobalHost の使用です。OWIN では、最初から構成を作成します。OWIN 統合を使用する場合は、どこでも GlobalHost を参照しないでください。
Startup
クラスが現在構成されているため:
var resolver = new AutofacDependencyResolver(container);
resolver.UseRedis("serverIp", portNumber, "password", "channelName");
新しいresolver
タイプを作成するAutofacDependencyResolver
と、Redis PubSub に正常に接続されます。ただし、問題は、1 つのメッセージを送信しようとすると、そのメッセージが何千回も繰り返されることです。
(Chrome コンソールでは、サーバーから単一のメッセージを送信すると、無限ループに陥り、クライアントはそれを無限に受信します)。
したがって、問題は、Autofac を依存関係リゾルバーとして使用しているときに SignalR Redis スケールアウトをセットアップするにはどうすればよいかです (注: 別の依存関係リゾルバーを使用できる状況はありません)。
ありがとう!
編集: ソリューションに関する詳細情報が必要な場合は、この行のないリポジトリを次に示します。
resolver.UseRedis("serverIp", portNumber, "password", "channelName");
ありがとう!
編集: いくつかのことを明確にする必要があるように感じます: を使用するresolver.UseRedis();
と、通常は (1 回) 送信されるすべてのメッセージが何度も送信されsubscribe "channelName"
ます。クライアントでの動作: 各メッセージは複数回送信されます。
次に行うことは、Autofac を使用しない基本的な SignalR アプリケーションを作成し、Redis の動作を確認することです。ただし、これは Autofac 関連の問題、より具体的には構成に関連する問題だと思います。
ありがとう!
更新: どうやら、Autofac を使用しない基本的な SignalR アプリにも同じ動作があります。この問題は Autofac とは何の関係もありません。