ASP.NET核心在中间件内部重定向

时间:2020-01-15 10:50:56

标签: asp.net-core entity-framework-core

我想创建一个页面,用于创建数据库并为每个新部署初始化应用程序的默认数据。为此,我创建了一个中间件,该中间件检查是否可以连接到数据库。如果无法连接到数据库(这意味着该数据库尚不存在),则中间件将重定向到负责收集默认数据的应用程序的操作,然后继续创建数据库。 但是,在中间件中,尽管进行了所有尝试,但重定向仍然无法进行,除了重定向到外部网站(例如google.com)。 我使用 asp.net核心2.2 entityframework核心

MissingDatabaseMiddleware.cs

public class MissingDatabaseMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly string _missingTenantUrl;

        public MissingDatabaseMiddleware(RequestDelegate next, string missingTenantUrl)
        {
            _next = next;
            _missingTenantUrl = missingTenantUrl;
        }
        public async Task Invoke(HttpContext httpContext, MydbContext context)
        {
            if (!context.Database.CanConnect())
            {
                httpContext.Response.Redirect(_missingTenantUrl, false);
                return;
            }
            await _next.Invoke(httpContext);
        }
    }

startup.cs

 public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env, MydbContext, ILoggerFactory loggerFactory){

 app.UseMiddleware<MissingDatabaseMiddleware>("/Setup/AppSetup");

 app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
                routes.MapRoute(
                    name: "areas",
                    template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
            });

}

1 个答案:

答案 0 :(得分:0)

解决方案是在请求网址中添加支票

 public async Task Invoke(HttpContext httpContext, MemoryDbContext context)
        {
            if (!context.Database.CanConnect() && !httpContext.Request.GetEncodedUrl().Contains(_missingTenantUrl))
            {
                httpContext.Response.Redirect(_missingTenantUrl, false);
                return;
            }
            await _next.Invoke(httpContext);
        }