简体   繁体   English

如何在ASP.NET Core应用程序中将记录器传递到服务器端的SignalR集线器

[英]How to pass logger into SignalR hub on server side in ASP.NET Core application

I have ASP.NET Core application with React client. 我有带有React客户端的ASP.NET Core应用程序。 I have SignalR messaging between server and client. 我在服务器和客户端之间有SignalR消息传递。

I have the following code on server side: 我在服务器端有以下代码:

Startup.cs

    ...
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseSignalR(routes =>
        {
            routes.MapHub<ChatHub>("/signalr");
        });
    }
    ...

Question: Could I pass logger to ChatHub from Startup.cs as I do it with another services like this: 问题:我可以通过其他服务将记录器从Startup.cs传递到ChatHub吗?

Startup.cs

        private readonly ILogger _log;

        public Startup(IHostingEnvironment env, ILogger<Startup> log)
        {
            _log = log;
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton(new Converter(_log));
        }

Could I pass logger to ChatHub from Startup.cs as I do it with another services like this 我可以像其他服务一样将记录器从Startup.cs传递到ChatHub吗?

I'm not sure why you want to pass a logger instance to ChatHub within Startup.cs . 我不确定为什么要在Startup.cs ChatHub记录器实例传递给ChatHub But As far as I know, you could always inject the required dependencies when you need. 但是据我所知,您总是可以在需要时注入所需的依赖项。 You don't have to manually pass a logger instance into ChatHub during startup. 在启动过程中,您不必手动将记录器实例传递到ChatHub中。 Typically that will be considered as a bad practice. 通常,这将被视为不良做法。 Just declare a dependency and let DI container inject it . 只需声明一个依赖项,然后让DI容器注入它

 
 
  
  
 
  services.AddSingleton(new Converter(_log));
 

 
 
services.AddSingleton<Converter>();   // DI will new it and inject logger for you

And also change your ChatHub constructor to accept a ILogger<ChatHub> 并更改您的ChatHub构造函数以接受ILogger<ChatHub>

public class ChatHub : Hub
{
    private readonly ILogger<ChatHub> _logger;

    public ChatHub(ILogger<ChatHub> logger)
    {
        this._logger = logger;
    }

    public async Task SendMessage(string user, string message)
    {
        this._logger.LogInformation($"send message to client\r\n {user}\t{message}");
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

If you do want to custom the initialization of Converter, you could make it as below: 如果确实要自定义Converter的初始化,则可以如下进行:

services.AddSingleton<Converter>(sp => {
    var logger = sp.GetRequiredService<ILogger<Converter>>();
    // add more service or dependencies manually ...
    return new Converter(logger, ...);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在服务器端捕获 ASP.NET Core 2 SignalR 异常并在客户端使用 JavaScript 处理它们? - How to catch ASP.NET Core 2 SignalR exceptions on server-side and handle them on client side with JavaScript? asp.net core 3.1 SignalR:将复杂对象从 javascript 客户端传递到集线器 - asp.net core 3.1 SignalR: pass complex object from javascript client to Hub 调用SignalR Hub不适用于Asp.Net Core Web API - Invoking SignalR Hub not working for Asp.Net Core Web API 来自客户端的集线器方法未在ASP.NET Core SignalR中调用 - Hub method from client is not invoking in ASP.NET Core SignalR ASP.NET Core SignalR可从任何地方访问Hub方法 - ASP.NET Core SignalR acces Hub method from anywhere 具有Application Insights的asp.net core 2记录器 - asp.net core 2 Logger with Application Insights 如何使用带有.NET Core的SignalR的Hub类的服务器端Timer? - How to use server-side Timer from Hub class using SignalR with .NET Core? 如何将SignalR集线器上下文传递到ASP .NET Core 2.1上的Hangfire作业? - How can I pass a SignalR hub context to a Hangfire job on ASP .NET Core 2.1? 您如何在控制器外部获得对ASP.NET Core SignalR集线器上下文的引用? - How do you get a reference to an ASP.NET Core SignalR hub context outside of a controller? 如何在 ASP.NET Core 2.2 中使用来自不同托管项目的共享 SignalR Hub - How to use shared SignalR Hub from different hosted project in ASP.NET Core 2.2
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM