доступ к dbcontext внутри Startup.Configure при добавлении перенаправлений с помощью app.UseRewriter (). Add () - PullRequest
2 голосов
/ 14 мая 2019

Мне нужно добавить перенаправления, основанные на имени хоста, читая карту пути-источника / пути-назначения из базы данных.

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;
    }));
}

Но это не работает, потому что db предположительно расположен:

enter image description here

DbContext добавлен в ConfigureServices следующим образом (область действия):

  var connection = Configuration.GetConnectionString("DefaultConnection");
  services.AddDbContext<gommeautoContext>(options => options.UseSqlServer(connection, sqlServerOptionsAction: sqlOptions =>
  {
    sqlOptions.EnableRetryOnFailure(maxRetryCount: 5,
    maxRetryDelay: TimeSpan.FromSeconds(5),
    errorNumbersToAdd: null);
  }));

И моя последняя попытка заставить его работатьследующий код:

  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();
  }

Но это не помогло.

Я предполагаю, что не так просто получить доступ к dbContext внутри UseRewriter.Add(, и я не могу понять, каксделать это ...

Кто-нибудь делает?

1 Ответ

0 голосов
/ 14 мая 2019

Этот подход был действительно правильным:

using (var serviceScope = app.ApplicationServices.CreateScope())
{
  var services = serviceScope.ServiceProvider;
  var _db = services.GetService<gommeautoContext>();

  ...

}

Но я был введен в заблуждение другой проблемой, как указано здесь https://stackoverflow.com/a/43876571/395773 В моем коде был ранее ожидаемый вызов, возвращающий void, неявно утилизирующийконтекст.

...