我需要根据主机名添加重定向,从数据库中读取源路径/目标路径的映射。
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被认为是被处理的:
在ConfigureServices中添加DbContext,如下所示(作用域):
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();
}
但没帮上忙。
我假设在UseRewriter.Add(
中访问dbContext
不是那么简单,而且我不知道该怎么做……
有人知道吗?
发布于 2019-05-15 03:41:20
这种方法实际上是正确的:
using (var serviceScope = app.ApplicationServices.CreateScope())
{
var services = serviceScope.ServiceProvider;
var _db = services.GetService<gommeautoContext>();
...
}
但我被另一个问题误导了,正如这里指出的那样,我在代码中有一个等待已久的调用,返回https://stackoverflow.com/a/43876571/395773,隐式地处理上下文。
https://stackoverflow.com/questions/56136580
复制相似问题