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

119

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:

el uso de 'UseMvc' para configurar MVC no es compatible mientras se usa Endpoint Routing. Para continuar usando 'UseMvc', configure 'MvcOptions.EnableEndpointRouting = false' dentro de 'ConfigureServices'.

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

Mehrdad Babaki
fuente
2
acerca de la forma correcta: este documento docs.microsoft.com/en-us/aspnet/core/migration/ ... establece "migrar la aplicación a Endpoint Routing si es posible"
dvitel

Respuestas:

23

pero necesito saber cuál es la forma correcta de resolverlo

En general, debe usar en EnableEndpointRoutinglugar de UseMvc, y puede consultar Actualizar código de inicio de enrutamiento para conocer los pasos detallados para habilitar EnableEndpointRouting.

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

Para UseMvc, usa 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.

Eduardo
fuente
121

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 se veía 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. Use 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 punto final. 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
fuente
2
Esto funciona en asp.net core 3.0 y puedo usar esta API web para agregar fácilmente
Tony Dong
1
Se recomienda (en esa página) usar en services.AddRazorPages();lugar deservices.AddMvc();
BurnsBA
1
Esta es una buena solución si está pasando por el primer tutorial de mvc y actualiza de core2.1 a core3.0. Esto resolvió mi problema de inmediato, ¡gracias!
Spencer Pollock
La opción 3 funcionó muy bien para mí en la construcción de una página
básica
50

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

services.AddMvc (opción => opción.EnableEndpointRouting = false)
Buenaventura72
fuente
2
¡Respuesta simple, pero gran respuesta!
noobprogrammer
DIGA CÓMO SE RESUELVE ESTE CÓDIGO, no me importa la solución, ya la sabía, quiero saber el POR QUÉ y el CÓMO ...
Amir Hossein Ahmadi
3

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

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

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

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

Si usa la plantilla .NET Core 3.0,

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

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

ingrese la descripción de la imagen aquí

Gracias

Akash Limbani
fuente
2

Para DotNet Core 3.1

Utilizar a continuación

Archivo: Startup.cs public void Configure (aplicación IApplicationBuilder, entorno IHostingEnvironment) {

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthentication();
        app.UseHttpsRedirection();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
sagar charde
fuente
¿Qué hacer con todas las líneas de configuración de servicios?
Fanchi
0

Puede utilizar: en el método ConfigureServices:

services.AddControllersWithViews();

Y para el método Configurar:

app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
NHARI Med
fuente
0

Esto funcionó para mí en .Net Core 3.1.

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

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
vivek nuna
fuente
-4

Usar código a continuación

app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
Mandy
fuente
Sería útil si explicaras cómo este código resuelve el problema.
Robert Columbia
Publicar simplemente el código no es una respuesta suficiente. Explique qué / por qué / cómo este código responderá a la pregunta.
nurdyguy
esto es solo la placa de la caldera que sale de la caja y en realidad no ayuda al usuario con que estén bien
Simon Price