0

ASP.NETMVC3とSignalR0.5.2を使用するサーバーソフトウェア用の内部Webアプリを作成しています。起動時に次の例外が発生することがあります。

System.InvalidOperationException: This method cannot be called during the application's pre-start initialization stage.

Server stack trace: 
   at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
   at System.Web.Compilation.BuildManager.GetReferencedAssemblies()
   at SignalR.Hosting.AspNet.Infrastructure.AspNetAssemblyLocator.GetAssemblies()
   at SignalR.Hubs.ReflectedHubDescriptorProvider.BuildHubsCache()
   at System.Lazy`1.CreateValue()

Exception rethrown at [0]: 
   at System.Lazy`1.get_Value()
   at SignalR.Hubs.ReflectedHubDescriptorProvider.TryGetHub(String hubName, HubDescriptor& descriptor)
   at SignalR.Hubs.DefaultHubManager.<>c__DisplayClass1.<GetHub>b__0(IHubDescriptorProvider p)
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at SignalR.Hubs.DefaultHubManager.GetHub(String hubName)
   at SignalR.Hubs.HubManagerExtensions.EnsureHub(IHubManager hubManager, String hubName)
   at SignalR.Hubs.HubDispatcher.GetSignals(ClientHubInfo hubInfo, String connectionId)
   at SignalR.Hubs.HubDispatcher.<>c__DisplayClass23.<CreateConnection>b__22(ClientHubInfo info)
   at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other)
   at System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection, IEqualityComparer`1 comparer)
   at SignalR.Connection..ctor(IMessageBus messageBus, IJsonSerializer jsonSerializer, String baseSignal, String connectionId, IEnumerable`1 signals, IEnumerable`1 groups, ITraceManager traceManager)
   at SignalR.Hubs.HubDispatcher.CreateConnection(String connectionId, IEnumerable`1 groups, IRequest request)
   at SignalR.PersistentConnection.ProcessRequestAsync(HostContext context)
   at SignalR.Hubs.HubDispatcher.ProcessRequestAsync(HostContext context)
   at SignalR.Hosting.AspNet.AspNetHandler.ProcessRequestAsync(HttpContextBase context)
   at SignalR.Hosting.AspNet.HttpTaskAsyncHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

これは、IIS Expressの再起動中にブラウザーが開いていて、ハブルートがマップされてから初期化が完了するまでの正確な瞬間に(SignalR javascriptを介して)要求を行っているために発生すると思われます。原因については完全に間違っている可能性があります。残念ながら、これを確実に再現することはできませんでした。これは私の最初のASP.NETプロジェクトであるため、何が起こっているのかについてかなり迷っています。

これは、App_StartフォルダーにあるNinjectWebCommon.csファイルです。

[assembly: WebActivator.PreApplicationStartMethod(typeof(WebStatusClient.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(WebStatusClient.App_Start.NinjectWebCommon), "Stop")]

namespace WebStatusClient.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;
    using SignalR.Infrastructure;
    using SignalR.Ninject;
    using SignalR;
    using System.Web.Routing;

    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        public static StandardKernel Kernel { get; private set; }

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);

            RouteTable.Routes.MapHubs();
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            Kernel = new StandardKernel();
            Kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            Kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(Kernel);
            return Kernel;
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<Impl.StatusForwarder>()
                .To<Impl.StatusForwarder>()
                .InSingletonScope();

            kernel.Bind<StatusInterfaceClient.IStatusNotificationTarget>()
                .ToMethod(context => context.Kernel.Get<Impl.StatusForwarder>());

            // Set the SignalR dependency injector.
            SignalR.GlobalHost.DependencyResolver = new SignalR.Ninject.NinjectDependencyResolver(kernel);

            // Force the creation of the status manager.
            Impl.StatusInterfaceManager.Initialize();
        }
    }
}

何がうまくいかないのかを理解するための提案はありますか?初期化プロセスの後半でハブをマッピングする必要がありますか?

4

0 に答える 0