4

次のような状況があります: 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私はアプリケーションでもう使用していないので(使用してもGlobalHostRedis にはまったく動作がありません) ( 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 とは何の関係もありません。

4

1 に答える 1