Изменение RouteData в Asp. Net Core 3.1 в Middleware - PullRequest
0 голосов
/ 21 марта 2020

Я недавно обновил свое приложение. Net Core 2.1 до версии 3.1, и есть одна часть, которая не была обновлена ​​должным образом.

Я бы написал код для сопоставления поддоменов с областями, как описано здесь

Теперь я понимаю, что метод использования app.UseMvc() следует заменить на app.UseEndpoints(), но Я не могу найти нигде в платформе 3.1, которая позволила бы мне писать в RouteData до app.UseEndpoints()

//update RouteData before this
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        "admin", "{area:exists}/{controller=Home}/{action=Index}/{id?}");
    endpoints.MapControllerRoute(
        "default", "{controller=Home}/{action=Index}/{id?}");
});

Есть ли способ записи в RouteData с использованием Middleware?

Я пытался вернуться к app.UseMvc(), поскольку он все еще находится в фреймворке, но MvcRouteHandler, похоже, больше не существует

app.UseMvc(routes =>
{
    routes.DefaultHandler = new MvcRouteHandler(); //The type of namespace could not be found
    routes.MapRoute(
        "admin",
        "{area:exists}/{controller=Home}/{action=Index}/{id?}");
    routes.MapRoute(
        "default",
        "{controller=Home}/{action=Index}/{id?}");
});

1 Ответ

1 голос
/ 23 марта 2020

Попробуйте использовать пользовательское промежуточное ПО .

Добавьте ссылку на использование Microsoft.AspNetCore.Routing и используйте метод Httpcontext.GetRouteData() для достижения RouteData

app.UseRouting();

app.Use(async (context, next) =>
{

    string url = context.Request.Headers["HOST"];
    var splittedUrl = url.Split('.');

    if (splittedUrl != null && (splittedUrl.Length > 0 && splittedUrl[0] == "admin"))
    {
        context.GetRouteData().Values.Add("area", "Admin");
    }

    // Call the next delegate/middleware in the pipeline
    await next();
});

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        "admin", "{area:exists}/{controller=Home}/{action=Index}/{id?}");
    endpoints.MapControllerRoute(
        "default", "{controller=Home}/{action=Index}/{id?}");
});
...