web-dev-qa-db-ja.com

SignalR + Autofac + OWIN:GlobalHost.ConnectionManager.GetHubContextが機能しないのはなぜですか?

1つのプロジェクトでOWIN、SignalR、Autofacを使用しようとしています。

私はsignalRに関して次のように設定しています:

       // Create the AutoFac container builder:
        var builder = new ContainerBuilder();

        // ...[Register various other things in here]...

        // register signalR Hubs
        builder.RegisterHubs(Assembly.GetExecutingAssembly());

        // Build the container:
        var container = builder.Build();

        // Configure SignalR with the dependency resolver.
        app.MapSignalR(new HubConfiguration
        {
            Resolver =  new AutofacDependencyResolver(container)
        });

私の問題は、Autofac SignalR統合を使用すると、サーバー(WebAPIコントローラーなど)でsignalRハブコンテキストを取得できなくなり、サーバー側から接続されたクライアントにメッセージを送信できないことです。次のようなものは、AutofacsignalR統合を使用していないときにこれを行う方法です。

var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.All.notification("Test Message");

しかし、これはAutofacをミックスに追加すると機能しません-エラーメッセージが表示されず、hubContextを取得しているように見えますが、それを呼び出すと実際にはクライアントに到達していないようです。

MapSignalRの呼び出しでsignalRの依存関係リゾルバーの使用をコメントアウトすると、GetHubContextの呼び出しは再び機能し、メッセージはsignalRクライアントに正常に到達しますが、もちろん、ハブでIoCを使用できなくなります。例えば.

        // Configure SignalR with the dependency resolver.
        app.MapSignalR(new HubConfiguration
        {
            // Resolver =  new AutofacDependencyResolver(container)
        });

AutofacDependencyResolverを使用するとGlobalHost.ConnectionManager.GetHubContextが正しく機能しなくなる理由を誰かに教えてもらえますか??

注:私が試したもう1つのことは、GlobalHost.ConnectionManager.GetHubContext()を使用する代わりに、クライアントにメッセージを送信するWebAPIコントローラーにIConnectionManagerを挿入し、その上でGetHubContextを呼び出しようとしましたが、Autofacはできませんでした。 IConnectionManagerを解決します。

私は明らかにこれを可能にするPiotrSzmydによる次の記事を見つけました:

http://www.szmyd.com.pl/blog/wiring-signalr-with-autofac

しかし、これは廃止されたsignalRビルドに基づいているようであり、ここにはnugetパッケージがあるようです。

http://www.nuget.org/packages/SignalR.AutoFac/

また、かなり時代遅れのようです。

29
mutex

SignalRでカスタム依存関係リゾルバーを使用する場合、変更しない限りGlobalHostを使用できなくなります。

GlobalHost.DependencyResolver = new AutofacDependencyResolver(container);
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();

// A custom HubConfiguration is now unnecessary, since MapSignalR will
// use the resolver from GlobalHost by default.
app.MapSignalR();

GlobalHostを変更したくない場合は、IConnectionManagerを手動で解決する必要があります。

IDependencyResolver resolver = new AutofacDependencyResolver(container);
IHubContext hubContext = resolver.Resolve<IConnectionManager>().GetHubContext<MyHub>();

app.MapSignalR(new HubConfiguration
{
    Resolver = resolver
});
32
halter73

SignalR、Autofac、およびOWINを使用して完全な答えを得るには、次のことを行いました。

// register IPersistantConnectionContext for access to SignalR connection
// and IDependencyResolver to enable inection of the container into its
// construction for the config object.
var builder = new ContainerBuilder();
builder.RegisterType<Autofac.Integration.SignalR.AutofacDependencyResolver>()
    .As<IDependencyResolver>()
    .SingleInstance();
builder.Register((context, p) =>
        context.Resolve<IDependencyResolver>()
            .Resolve<Microsoft.AspNet.SignalR.Infrastructure.IConnectionManager>()
            .GetConnectionContext<SignalRConnection>());

// ... other registrations

var container = builder.Build();

var signalrConfiguration = new ConnectionConfiguration
{
    Resolver = container.Resolve<IDependencyResolver>(),
};

app.UseAutofacMiddleware(container);

app.MapSignalR<SignalRConnection>("/signalr", signalrConfiguration);

// ... other middleware

私のコントローラーには、タイプIPersistentConnectionContextのパラメーターを含め、正しいインスタンスが挿入されています。

PersistentConnectionを使用していましたが、ハブでも同様であるはずです。

2
Nathan