gpt4 book ai didi

c# - 将 SignalR 的 ITransportHeartbeat 添加到 Autofac

转载 作者:行者123 更新时间:2023-12-04 10:01:04 37 4
gpt4 key购买 nike

我正在尝试使用 Autofac 来拥有 ITransportHeartbeat 的一个实例我的 ASP.NET MVC 5 应用程序的接口(interface),用于跟踪所有连接的用户。我使用 ITransportHeartbeat接口(interface)来确定用户的连接是否仍然处于事件状态。为此,我需要使用 Autofac 为应用程序创建一个 SignalR 集线器实例。

挑战:当我运行应用程序时,它永远不会遇到被覆盖的 OnConnected() , OnReconnected() , 或 OnDisconnected()在 SignalR 集线器中。但是,客户的hub.start()被击中,我看到 Hub Started页面加载时的消息:

$.connection.hub.start().done(function () {
console.log("Hub Started");
});

如果我向集线器添加一个无参数构造函数,它确实会命中它们,但随后会出现 ITransportHeartbeat interface 为空,这违背了将接口(interface)注入(inject)集线器的目的。

我引用了以下内容以寻求帮助:
  • https://stackoverflow.com/a/49214891/177416
  • https://autofaccn.readthedocs.io/en/latest/integration/signalr.html
  • https://stackoverflow.com/a/36476106/177416
  • https://stackoverflow.com/a/21126852/177416

  • 这里是 Startup.cs :
    public partial class Startup
    {
    public void Configuration(IAppBuilder app)
    {
    ConfigureAuth(app);

    var builder = new ContainerBuilder();
    var config = GlobalConfiguration.Configuration;

    builder.RegisterControllers(typeof(MvcApplication).Assembly)
    .InstancePerRequest();
    builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
    .InstancePerRequest();

    var signalRConfig = new HubConfiguration();
    builder.RegisterType<MonitoringHubBase>().ExternallyOwned();

    builder.RegisterType<Autofac.Integration.SignalR.AutofacDependencyResolver>()
    .As<Microsoft.AspNet.SignalR.IDependencyResolver>()
    .SingleInstance();
    builder.Register(context =>
    context.Resolve<Microsoft.AspNet.SignalR.IDependencyResolver>()
    .Resolve<IConnectionManager>()
    .GetHubContext<MonitoringHubBase, IMonitoringHubBase>())
    .ExternallyOwned();
    builder.RegisterType<Microsoft.AspNet.SignalR.Transports.TransportHeartbeat>()
    .As<Microsoft.AspNet.SignalR.Transports.ITransportHeartbeat>()
    .SingleInstance();

    var container = builder.Build();
    DependencyResolver.SetResolver(
    new Autofac.Integration.Mvc.AutofacDependencyResolver(container));

    signalRConfig.Resolver = container
    .Resolve<Microsoft.AspNet.SignalR.IDependencyResolver>();

    app.UseAutofacMiddleware(container);
    app.MapSignalR("/signalr", signalRConfig);

    config.DependencyResolver =
    new AutofacWebApiDependencyResolver((IContainer)container);

    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    }

    这是其他集线器从中派生的集线器:
    public interface IMonitoringHubBase
    {
    Task OnConnected();
    Task OnReconnected();
    Task OnDisconnected(bool stopCalled);
    }

    public abstract class MonitoringHubBase : Hub<IMonitoringHubBase>
    {
    private ITransportHeartbeat Heartbeat { get; }

    public MonitoringHubBase(ITransportHeartbeat heartbeat)
    {
    Heartbeat = heartbeat;
    }

    public MonitoringHubBase()
    {
    }

    public override async Task OnConnected()
    {
    // Add connection to db...
    }

    public override async Task OnReconnected()
    {
    // Ensure connection is on db...
    }

    public override async Task OnDisconnected(bool stopCalled)
    {
    // Remove connection from db...
    }

    public async Task SomeMethod(int id)
    {
    // Heartbeat object used here...
    }
    }

    这是从基础集线器继承的集线器之一:
    [HubName("MyHub")]
    public class MyHub : MonitoringHubBase
    {
    public MyHub(ITransportHeartbeat heartbeat) : base(heartbeat)
    {
    }

    public MyHub()
    {
    }
    }

    最佳答案

    找到了解决方案!从集线器中删除了无参数 c'tor 并修改了 Startup.cs对此;希望这可以帮助下一个为此苦苦挣扎的人:

    public partial class Startup
    {
    public void Configuration(IAppBuilder app)
    {
    ConfigureAuth(app);

    var builder = new ContainerBuilder();
    var config = new HttpConfiguration();

    builder.RegisterHubs(Assembly.GetExecutingAssembly());
    builder.RegisterControllers(typeof(MvcApplication).Assembly)
    .InstancePerRequest();
    builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
    .InstancePerRequest();
    builder.RegisterType<Microsoft.AspNet.SignalR.Transports.TransportHeartbeat>()
    .As<Microsoft.AspNet.SignalR.Transports.ITransportHeartbeat>()
    .SingleInstance();
    builder.RegisterType<Autofac.Integration.SignalR.AutofacDependencyResolver>()
    .As<Microsoft.AspNet.SignalR.IDependencyResolver>()
    .SingleInstance();

    var container = builder.Build();

    var signalRConfig = new HubConfiguration();
    signalRConfig.Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container);

    app.UseAutofacMiddleware(container);

    DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));

    app.Map("/signalr", map =>
    {
    map.UseAutofacMiddleware(container);

    var hubConfiguration = new HubConfiguration
    {
    Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container),
    };

    map.RunSignalR(hubConfiguration);
    });

    config.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container);

    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    }

    在这篇文章的帮助下: https://kwilson.io/blog/get-your-web-api-playing-nicely-with-signalr-on-owin-with-autofac/

    关于c# - 将 SignalR 的 ITransportHeartbeat 添加到 Autofac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61817392/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com