在中间件中更改 Asp.Net Core 3.1 中的 RouteData

Changing RouteData in Asp.Net Core 3.1 in Middleware

我最近将我的 .Net Core 2.1 应用程序更新到 3.1,但有一部分没有按预期升级。

我编写了代码来将子域映射到所描述的区域

我现在意识到使用 app.UseMvc() 的方法应该用 app.UseEndpoints() 代替,但是我在 3.1 框架中找不到任何地方可以让我写入 RouteDataapp.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

我试过回到 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?}");
});

尝试使用custom middleware

添加引用使用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?}");
});