Handling Redirects with Middleware in .Net

I had a need to do a load of redirects when migrating a site from one platform to Umbraco 13. 

Here is how I handled the issue by using middleware and a csv file. 

The CSV file was created by a client and would be updated / maintained by them so it made sense to use that as the "source of truth". 

The CSV file looks a bit like this : 

/old-page,/new-page
/another-old-page,/another-new-page

The CSV file is saved on the root of my solution for ease of access.

The Middleware code, which is saved in a file called RedirectMiddleware.cs looks like this:

namespace MySite.Web.Infrastructure.Middleware
{
    public class RedirectMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly Serilog.ILogger _logger;
        private readonly Dictionary<string, string> _redirects;

        public RedirectMiddleware(RequestDelegate next, Serilog.ILogger logger)
        {
            _next = next;
            _logger = logger;
            _redirects = LoadRedirects();
        }

        public async Task InvokeAsync(HttpContext context)
        {
            if (_redirects.TryGetValue(context.Request.Path.Value, out var targetUrl))
            {
                _logger.Information($"Redirecting from {context.Request.Path} to {targetUrl}");
                context.Response.Redirect(targetUrl, true);
                return;
            }

            await _next(context);
        }

        private Dictionary<string, string> LoadRedirects()
        {
            var redirects = new Dictionary<string, string>();
            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "redirects.csv");

            if (File.Exists(filePath))
            {
                var lines = File.ReadAllLines(filePath);
                foreach (var line in lines)
                {
                    var parts = line.Split(',');
                    if (parts.Length == 2)
                    {
                        redirects[parts[0].Trim()] = parts[1].Trim();
                    }
                }
            }

            return redirects;
        }
    }
}

and then in my Startup.cs or Program.cs I just added the Middleware like :

app.UseMiddleware<RedirectMiddleware>();

And that is it. When I hit /old-page I am redirected to /new-page (as long as it exists, if it doesn't then I will still get a 404 error.

One thing to note, this is using Serilog.ILogger as it's within an Umbraco 13 site and this allows me to save to the log files within Umbraco.

Published on : 28 August 2024