I need to add redirects based on hostname, reading the map of source-path/destination-path from the database.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IMemoryCache memoryCache, ILoggerFactory loggerFactory, myDbContext db) { app.UseRewriter(new RewriteOptions() .AddRedirect("(.*)/$", "$1") .Add(ctx => { var req = ctx.HttpContext.Request; var hostName = req.Host; /* ** here I am willing to use db to do something like... */ var redirects = db.redirect .Where(r=> r.host == hostName ).ToList(); /* ** so that I can do something like this: */ var newUrl = DetermineNewUrl(req,redirects); var response = ctx.HttpContext.Response; response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Location] = newUrl; response.StatusCode = 301; ctx.Result = RuleResult.EndResponse; })); } But it doesn't work, because db is supposedly disposed:
DbContext is added in ConfigureServices like this (scoped):
var connection = Configuration.GetConnectionString("DefaultConnection"); services.AddDbContext<gommeautoContext>(options => options.UseSqlServer(connection, sqlServerOptionsAction: sqlOptions => { sqlOptions.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(5), errorNumbersToAdd: null); })); And my last attempt to make it work was using the following code:
using (var serviceScope = app.ApplicationServices.CreateScope()) { var services = serviceScope.ServiceProvider; var _db = services.GetService<gommeautoContext>(); var redirects = db.redirect .Where(r=> r.host == hostName ).ToList(); } But didn't help.
I assume it's not that simple to access dbContext inside UseRewriter.Add(, and I can't figure out how to do it...
Anyone does?
