Создаю интернет-магазин. И я хочу добавить короткие URL-адреса для продуктов, категорий и так далее. Например:
store.com/iphone-7-plus
Эта ссылка должна открывать страницу с продуктом iPhone 7 plus.
Логика такова:
Очевидные решения и почему они не применимы:
Первое решение - это новый маршрут вроде этого:
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.
Так что вопрос все еще открыт - не могли бы вы посоветовать мне какое-нибудь подходящее решение?
Проблема в том, что у меня уже есть интернет-магазин, работающий над NotCommerce. Итак, у меня уже есть URL-адреса типа store.com/iphone-7-plus во всех поисковых системах, на торговых площадках и так далее.





Для доступа к 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);
}
Вы также можете попробовать Middleware, чтобы проверить, не существует ли reuqest, а затем вернуть ожидаемый ответ.
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
}
Сделайте маршрут более конкретным для продуктов, например
store.com/products/iphone-7-plus, тогда ваш последний вариант будет работать без получения «всего».