Forum Discussion

aly2014's avatar
aly2014
Copper Contributor
Aug 19, 2024

how to configure asp.net.core ihostservice with global exception handler

hi ,I am developing a windows service under asp.net.core 8 as ihostservice , everything is good , but I want to configure global exception handler , I did look to most article on the net , all of them about just asp.net.core or API , ı just need to iho

5 Replies

  • shanewatson5091's avatar
    shanewatson5091
    Copper Contributor

    You can set up a try-catch block at the top level in your IHost or implement a custom middleware-like mechanism for services running in the host.

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    using System;
    using System.Threading;
    using System.Threading.Tasks;
    
    class Program
    {
        static async Task Main(string[] args)
        {
            var host = Host.CreateDefaultBuilder(args)
                .ConfigureServices((context, services) =>
                {
                    services.AddHostedService<MyService>();
                    services.AddSingleton<IGlobalExceptionHandler, GlobalExceptionHandler>();
                })
                .Build();
    
            try
            {
                await host.RunAsync();
            }
            catch (Exception ex)
            {
                var logger = host.Services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An unhandled exception occurred in the host.");
            }
        }
    }
    
    public class MyService : IHostedService
    {
        private readonly ILogger<MyService> _logger;
        private readonly IGlobalExceptionHandler _exceptionHandler;
    
        public MyService(ILogger<MyService> logger, IGlobalExceptionHandler exceptionHandler)
        {
            _logger = logger;
            _exceptionHandler = exceptionHandler;
        }
    
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            try
            {
                _logger.LogInformation("Service is starting...");
                // Simulate work
                throw new InvalidOperationException("Simulated exception in service.");
            }
            catch (Exception ex)
            {
                _exceptionHandler.HandleException(ex);
            }
        }
    
        public Task StopAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("Service is stopping...");
            return Task.CompletedTask;
        }
    }
    
    public interface IGlobalExceptionHandler
    {
        void HandleException(Exception ex);
    }
    
    public class GlobalExceptionHandler : IGlobalExceptionHandler
    {
        private readonly ILogger<GlobalExceptionHandler> _logger;
    
        public GlobalExceptionHandler(ILogger<GlobalExceptionHandler> logger)
        {
            _logger = logger;
        }
    
        public void HandleException(Exception ex)
        {
            // Log or take other appropriate actions
            _logger.LogError(ex, "An exception occurred.");
        }
    }

     

  • Hi Have you tried IhostSevice in the main program ?
    with register a custom global exception handler ?
    • aly2014's avatar
      aly2014
      Copper Contributor
      ihostservice is working good and also register custome exception handler , but its not calling on exception ,my ihostservice not use any http request or respond , we just use for listen to a database and logging

Resources