0

我拥有 SignalR 的所有 Nuget 位,我正在尝试使用我自己的 clientID 以及 SignalR 附带的依赖注入容器用于我的所有其他存储库等。现在奇怪的是这个连接到集线器的jQuery失败了:

 debugger;
        // Proxy created on the fly
        var chat = $.connection.chat;

基本上,聊天对象变得未定义,就好像 SignalR 无法解析一样。一旦我尝试使用下面的代码覆盖 SignalR 的默认解析器,这种情况就开始发生。

我在这里想念什么?

我遇到的另一个问题是我不确定实现 IConnectionIdFactory 的 UserClientIDfactory 是否也能正常工作。

这是我 Global.asax 中的 MVC3 代码

private static IKernel CreateKernel()
  {
      var kernel = new StandardKernel();
      RegisterServices(kernel);
      return kernel;
  }



private static void RegisterServices(IKernel kernel)
  {

      kernel.Bind<UserIdClientIdFactory>()
       .To<UserIdClientIdFactory>()
         .InRequestScope();         

         //Rest of the other stuff to inject
   }



protected void Application_Start()
    {

        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

      //ninject calls to create the kernal etc
        IKernel kernel = CreateKernel();

      //TO DO using signal IR resolver
        var resolver = new NinjectDependencyResolver(kernel);
        SignalR.Hosting.AspNet.AspNetHost.SetResolver(resolver);
    }

最后,这是我的自定义 clientIDfactory 的代码

public class UserIdClientIdFactory : IConnectionIdFactory
{


#region IConnectionIdFactory Members

string IConnectionIdFactory.CreateConnectionId(SignalR.Hosting.IRequest request)
{
    // get and return the UserId here, in my app it is stored 
    // in a custom IIdentity object, but you get the idea 


    return HttpContext.Current.User.Identity.Name != null ?
    //TO DO change to get profileID from Appfabric or the database and log user infor   
         HttpContext.Current.User.Identity.Name.ToString() :
         Guid.NewGuid().ToString();
}
#endregion
} 
4

2 回答 2

1

当我阅读您的问题时,您询问如何使用相同的 DI 容器在 ASP.NET MVC 和 SignalR 中进行正确的依赖注入(因此只需要在一个地方声明绑定)。如果这是正确的理解,我曾经写过一篇关于这个的博客文章:http: //lcdev.dk/2012/02/14/using-signalr-ninject-with-asp-net-mvc3-and-the-ninject-mvc3 -nuget 包/

在博客文章中,我假设您使用的是 ASP.NET MVC3 以及 Ninject.MVC3 和 SignalR.Ninject Nuget 包。

但是,如果不是这种情况,我确实对您的代码有评论。对我来说,用于进行绑定的内核(in )似乎RegisterServices不是您实际向 SignalR 注册的内核。如果是这种情况,那么 SignalR 当然不会知道您的预期绑定,并且可能会由于您使用未实例化的对象引用而引发异常 -> 这可能会解释为什么您不再可以连接到您的SignalR 集线器。

于 2012-03-02T11:28:31.640 回答
0

好的,谢谢你的帖子,让我做更多的挖掘,我阅读了你链接的关于如何将 Ninject 与 MVC3 一起使用的帖子的其余部分,这让我意识到我有 ninject,但没有 Ninject Mvc3 的 Nuget Bits,我补充说,alos 使用以下帖子修改了我的 global.asax

http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/

这是 gloabal.asax 中的工作代码我还删除了 NinJect mvc3 添加到应用程序启动文件夹中的引导程序,因为它在上面的帖子中是这样工作的

public class MvcApplication : NinjectHttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {


            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");           
            //routes.IgnoreRoute("{*allaxd}", new { allaxd = @".*\.axd(/.*)?" });  //added for mango chat



            routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );






        }

      public override void Init()
        {
            this.AuthenticateRequest += new EventHandler(MvcApplication_AuthenticateRequest);
            this.PostAuthenticateRequest += new EventHandler(MvcApplication_PostAuthenticateRequest);
            base.Init();
        }


      #region "Ninject stuff for dependancy Injection

      /// <summary>
      /// Creates the kernel that will manage your application.
      /// </summary>
      /// <returns>The created kernel.</returns>
      protected override IKernel CreateKernel()
      { 
          var kernel = new StandardKernel();
         // kernel.Load(Assembly.GetExecutingAssembly());
          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<UserIdClientIdFactory>()
           .To<UserIdClientIdFactory>()
             .InRequestScope();         


          SignalR.Hosting.AspNet.AspNetHost.DependencyResolver.Register(typeof(IConnectionIdFactory), () => new UserIdClientIdFactory());




      }

      #endregion

      protected override void OnApplicationStarted() 
      {
          base.OnApplicationStarted();
          //for project awesome
          ModelMetadataProviders.Current = new AwesomeModelMetadataProvider();
          AreaRegistration.RegisterAllAreas(); 
          RegisterGlobalFilters(GlobalFilters.Filters);
          RegisterRoutes(RouteTable.Routes); 

      }













    }
于 2012-03-02T19:52:39.987 回答