No se admite el uso de 'UseMvc' para configurar MVC mientras se utiliza Endpoint Routing

Resuelto Nick Mehrdad Babaki asked hace 5 años • 11 respuestas

Tenía un proyecto Asp.Net core 2.2.

Recientemente, cambié la versión de .net core 2.2 a .net core 3.0 Preview 8. Después de este cambio, veo este mensaje de advertencia:

No se admite el uso de 'UseMvc' para configurar MVC mientras se utiliza Endpoint Routing. Para continuar usando 'UseMvc', configure 'MvcOptions.EnableEndpointRouting = false' dentro de 'ConfigureServices'.

Entiendo que al configurarlo EnableEndpointRoutingen falso puedo resolver el problema, pero necesito saber cuál es la forma correcta de resolverlo y por qué Endpoint Routing no necesita UseMvc()funcionar.

Nick Mehrdad Babaki avatar Aug 28 '19 08:08 Nick Mehrdad Babaki
Aceptado

Encontré la solución en la siguiente documentación oficial " Migrar de ASP.NET Core 2.2 a 3.0 ":

Hay 3 enfoques:

  1. Reemplace UseMvc o UseSignalR con UseEndpoints.

En mi caso, el resultado fue así.

  public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        //Old Way
        services.AddMvc();
        // New Ways
        //services.AddRazorPages();
    }


    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();
        app.UseRouting();
        app.UseCors();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}");
        });

    }
}

O
2. Utilice AddControllers() y UseEndpoints()

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }


    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();
        app.UseRouting();
        app.UseCors();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });

    }
}

O
3. Deshabilite el enrutamiento de terminales. Como sugiere el mensaje de excepción y como se menciona en la siguiente sección de documentación: use mvc sin enrutamiento de punto final


services.AddMvc(options => options.EnableEndpointRouting = false);
//OR
services.AddControllers(options => options.EnableEndpointRouting = false);
Sergii Zhuravskyi avatar Oct 07 '2019 10:10 Sergii Zhuravskyi

Esto funcionó para mí (agregue Startup.cs> método ConfigureServices):

servicios.AddMvc(opción => opción.EnableEndpointRouting = falso)
Bonaventura72 avatar Nov 08 '2019 19:11 Bonaventura72

pero necesito saber cual es la forma correcta de solucionarlo

En general, debe utilizar EnableEndpointRoutingen lugar de UseMvcy puede consultar Actualizar el código de inicio de enrutamiento para conocer los pasos detallados para habilitarlo EnableEndpointRouting.

por qué Endpoint Routing no necesita la función UseMvc().

Porque UseMvcusa the IRouter-based logicy EnableEndpointRoutingusa endpoint-based logic. Están siguiendo una lógica diferente que se puede encontrar a continuación:

if (options.Value.EnableEndpointRouting)
{
    var mvcEndpointDataSource = app.ApplicationServices
        .GetRequiredService<IEnumerable<EndpointDataSource>>()
        .OfType<MvcEndpointDataSource>()
        .First();
    var parameterPolicyFactory = app.ApplicationServices
        .GetRequiredService<ParameterPolicyFactory>();

    var endpointRouteBuilder = new EndpointRouteBuilder(app);

    configureRoutes(endpointRouteBuilder);

    foreach (var router in endpointRouteBuilder.Routes)
    {
        // Only accept Microsoft.AspNetCore.Routing.Route when converting to endpoint
        // Sub-types could have additional customization that we can't knowingly convert
        if (router is Route route && router.GetType() == typeof(Route))
        {
            var endpointInfo = new MvcEndpointInfo(
                route.Name,
                route.RouteTemplate,
                route.Defaults,
                route.Constraints.ToDictionary(kvp => kvp.Key, kvp => (object)kvp.Value),
                route.DataTokens,
                parameterPolicyFactory);

            mvcEndpointDataSource.ConventionalEndpointInfos.Add(endpointInfo);
        }
        else
        {
            throw new InvalidOperationException($"Cannot use '{router.GetType().FullName}' with Endpoint Routing.");
        }
    }

    if (!app.Properties.TryGetValue(EndpointRoutingRegisteredKey, out _))
    {
        // Matching middleware has not been registered yet
        // For back-compat register middleware so an endpoint is matched and then immediately used
        app.UseEndpointRouting();
    }

    return app.UseEndpoint();
}
else
{
    var routes = new RouteBuilder(app)
    {
        DefaultHandler = app.ApplicationServices.GetRequiredService<MvcRouteHandler>(),
    };

    configureRoutes(routes);

    routes.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute(app.ApplicationServices));

    return app.UseRouter(routes.Build());
}

Para EnableEndpointRouting, utiliza EndpointMiddleware para enrutar la solicitud a los puntos finales.

Edward avatar Aug 29 '2019 08:08 Edward

El problema que encontré se debe a las actualizaciones del marco .NET Core. La última versión lanzada de .NET Core 3.0 requiere una suscripción explícita para usar MVC.

Este problema es más visible cuando se intenta migrar desde .NET Core anterior (versión 2.2 o versión preliminar 3.0) a .NET Core 3.0.

Si migra de 2.2 a 3.0, utilice el siguiente código para solucionar el problema.

services.AddMvc(options => options.EnableEndpointRouting = false);

Si utiliza la plantilla .NET Core 3.0,

services.AddControllers(options => options.EnableEndpointRouting = false);

Método ConfigServices después de la corrección como se muestra a continuación,

ingrese la descripción de la imagen aquí

Gracias

Akash Limbani avatar Jul 02 '2020 10:07 Akash Limbani

Endpoint Routing está deshabilitado de forma predeterminada en ASP.NET 5.0

Simplemente configure como en Inicio

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(options => options.EnableEndpointRouting = false);
    }
    

Esto funcionó para mí

Md. Nazmul Alom avatar Apr 06 '2021 15:04 Md. Nazmul Alom