Asp.net core Asp.net核心中带有DB的通用字符串路由器
我正在创建一个网络商店。我想为产品、类别等添加短URL。 例如: store.com/iphone-7-plus 此链接将打开iPhone 7 plus产品的页面 逻辑是: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
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
}