![](/img/trans.png)
[英]How to catch ASP.NET Core 2 SignalR exceptions on server-side and handle them on client side with JavaScript?
[英]How to pass logger into SignalR hub on server side in ASP.NET Core application
我有帶有React客戶端的ASP.NET Core應用程序。 我在服務器和客戶端之間有SignalR消息傳遞。
我在服務器端有以下代碼:
Startup.cs
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("/signalr");
});
}
...
問題:我可以通過其他服務將記錄器從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));
}
我可以像其他服務一樣將記錄器從Startup.cs傳遞到ChatHub嗎?
我不確定為什么要在Startup.cs
ChatHub
記錄器實例傳遞給ChatHub
。 但是據我所知,您總是可以在需要時注入所需的依賴項。 在啟動過程中,您不必手動將記錄器實例傳遞到ChatHub
中。 通常,這將被視為不良做法。 只需聲明一個依賴項,然后讓DI容器注入它 。
services.AddSingleton(new Converter(_log));services.AddSingleton<Converter>(); // DI will new it and inject logger for you
並更改您的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); } }
如果確實要自定義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.