使用app.UseRewriter()添加重定向时,在Startup.Configure中访问dbcontext。添加()

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (63)

我需要添加基于主机名的重定向,从数据库中读取source-path / destination-path的映射。

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应该处理:

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(,我无法弄清楚如何做到这一点......

有人吗?

提问于
用户回答回答于

这种方法实际上是正确的:

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

  ...

}

但是我被另一个问题误导了,正如这里指出的那样https://stackoverflow.com/a/43876571/395773我在我的代码中有一个等待的早期调用返回void,隐式处理上下文。

扫码关注云+社区

领取腾讯云代金券