Asp.net core Asp.net核心中带有DB的通用字符串路由器

Asp.net core Asp.net核心中带有DB的通用字符串路由器,asp.net-core,routing,routes,.net-core,Asp.net Core,Routing,Routes,.net Core,我正在创建一个网络商店。我想为产品、类别等添加短URL。 例如: store.com/iphone-7-plus 此链接将打开iPhone 7 plus产品的页面 逻辑是: 服务器收到一个URL 服务器将针对现有路由进行尝试 如果此路径没有任何路由-服务器将查看数据库并尝试查找具有此类标题的产品或类别 显而易见的解决方案及其不适用的原因: 第一个解决方案是这样一条新路线: public class StringRouter : IRouter { private readonly IRo

我正在创建一个网络商店。我想为产品、类别等添加短URL。 例如:

store.com/iphone-7-plus

此链接将打开iPhone 7 plus产品的页面

逻辑是:

  • 服务器收到一个URL
  • 服务器将针对现有路由进行尝试
  • 如果此路径没有任何路由-服务器将查看数据库并尝试查找具有此类标题的产品或类别
  • 显而易见的解决方案及其不适用的原因:

    第一个解决方案是这样一条新路线:

    public class StringRouter : IRouter
    {
        private readonly IRouter _defaultRouter;
    
        public StringRouter(IRouter defaultRouter)
        {
            _defaultRouter = defaultRouter;
        }
    
        public async Task RouteAsync(RouteContext context)
        {
            // special loggic
    
            await _defaultRouter.RouteAsync(context);
        }
    
        public VirtualPathData GetVirtualPath(VirtualPathContext context)
        {
            return _defaultRouter.GetVirtualPath(context);
        }
    }
    
    问题是我无法从
    StringRouter
    提供对数据库的任何访问

    第二个解决方案是:

    public class MasterController : Controller
    {
        [Route("{path}")]
        public IActionResult Map(string path)
        {
            // some logic
        }
    }
    
    问题是服务器实际上接收所有调用,如
    store.com/robots.txt


    因此,问题仍然悬而未决-您能告诉我一些适用的解决方案吗?

    对于访问
    DbContext
    ,您可以尝试:

         using Microsoft.Extensions.DependencyInjection;
    
        public async Task RouteAsync(RouteContext context)
        {           
            var dbContext = context.HttpContext.RequestServices.GetRequiredService<RouterProContext>();
            var products = dbContext.Product.ToList();
            await _defaultRouter.RouteAsync(context);
        }
    

    为产品制定更具体的路线,例如
    store.com/products/iphone-7-plus
    ,那么您的最后一个选项将在不接收“所有内容”的情况下工作。问题是我已经有一家互联网商店在NotCommerce上工作。因此,我已经在所有搜索引擎、市场等中使用了类似store.com/iphone-7-plus的URL。
                public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
            {                
                app.Use(async (context,next) => {
    
                    await next.Invoke();
                    // add your own business logic to check this if statement
                    if (context.Response.StatusCode == 404)
                    {
                            var db = context.RequestServices.GetRequiredService<RouterProContext>();
                            var users = db.Users.ToList();
                            await context.Response.WriteAsync("Request From Middleware");
                    }
                });
                //your rest code
            }