4

私は小さな Web アプリケーションを作成しており、Signalr を使用してプッシュ通知を作成したいと考えていますが、他のアセンブリからハブを読み込んでいるときに何も起こりません。

ここに私のasp.net mvcプロジェクトを参照する他のライブラリからの私のアセンブリロケータがあります

public class HubAssemblyLocator : IAssemblyLocator {

    public IList<Assembly> GetAssemblies() {


        IList<Assembly> allAsms = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();

        var executingDirectory = AppDomain.CurrentDomain.BaseDirectory;

        var assemblyFiles = Directory.EnumerateFiles( executingDirectory, "Application" );

        foreach ( var assemblyFile in assemblyFiles.Where( _ => _.EndsWith( ".dll" ) ) ) {

            var asm = Assembly.LoadFile( assemblyFile );

            if ( asm.GetTypes().Any( _ => _.BaseType == typeof( Hub ) ) ) {
                allAsms.Add( asm );
            }
        }

        return allAsms;
    }
}

ここで、Global.asax の ApplicationStart イベント

public class MvcApplication : System.Web.HttpApplication {

    protected void Application_Start() {

        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register( GlobalConfiguration.Configuration );
        FilterConfig.RegisterGlobalFilters( GlobalFilters.Filters );
        RouteConfig.RegisterRoutes( RouteTable.Routes );
        InitializeRepositories.Initialize();



        var servicesPre = GlobalHost.DependencyResolver.GetServices( typeof( IAssemblyLocator ) );

        RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true});

        GlobalHost.DependencyResolver.Register( typeof( IAssemblyLocator ), () => new HubAssemblyLocator() );

        var servicesPost = GlobalHost.DependencyResolver.GetServices(typeof (IAssemblyLocator));
    }
}

この質問ではこの問題は解決しましたが、私の状況ではうまくいきません。

SignalR IAssemblyLocator が起動されない

私の状況では、アセンブリロケータは実行されません。

更新: エリアとルートを登録する前にハブを登録するだけです。

4

1 に答える 1

1

RouteTable.Routes.MapHubs() は RegisterRoutes() の前に呼び出す必要がありますが、Application_Start では後で呼び出されます。MapHubs() を呼び出した後に HubAssemblyLocator も登録しますが、論理的には前に行う必要があります。

于 2013-08-17T20:17:34.100 に答える