Використання "UseMvc" для налаштування MVC не підтримується під час використання маршрутизації кінцевих точок


120

У мене був проект основної програми Asp.Net 2.2.

Нещодавно я змінив версію з .net core 2.2 на .net core 3.0 Preview 8. Після цієї зміни я бачу це попередження:

використання "UseMvc" для налаштування MVC не підтримується під час використання маршрутизації кінцевих точок. Щоб продовжити використовувати "UseMvc", будь ласка, встановіть "MvcOptions.EnableEndpointRouting = false" всередині "ConfigureServices".

Я розумію, що встановивши EnableEndpointRoutingзначення false, я можу вирішити проблему, але мені потрібно знати, що є правильним способом її вирішення та чому маршрутизації для Endpoint не потрібна UseMvc()функція.


2
про належний спосіб: цей doc docs.microsoft.com/en-us/aspnet/core/migration/… заявляє, "якщо можливо,
перенесіть

Відповіді:


23

але мені потрібно знати, що є правильним способом її вирішення

Загалом, ви повинні використовувати EnableEndpointRoutingзамість UseMvc, і ви можете посилатися на код запуску Оновити маршрутизацію для детальних кроків, щоб увімкнутиEnableEndpointRouting .

чому маршрутизація кінцевої точки не потребує функції UseMvc ().

Бо UseMvcвін the IRouter-based logicі EnableEndpointRoutingвикористовує endpoint-based logic. Вони дотримуються різної логіки, яку можна знайти нижче:

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());
}

Для EnableEndpointRoutingцього він використовує EndpointMiddleware для маршрутизації запиту до кінцевих точок.


123

Я знайшов рішення в наступній офіційній документації " Перехід з ASP.NET Core 2.2 на 3.0 ":

Існує 3 підходи:

  1. Замініть UseMvc або UseSignalR на UseEndpoints.

У моєму випадку результат виглядав так

  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}");
        });

    }
}

АБО
2. Використовуйте AddControllers () та 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();
        });

    }
}

АБО
3. Вимкнути маршрутизацію кінцевої точки. Як випливає з повідомлення про виключення та як зазначено в наступному розділі документації: використовуйте маршрутизацію mvcwout без кінцевих точок


services.AddMvc(options => options.EnableEndpointRouting = false);
//OR
services.AddControllers(options => options.EnableEndpointRouting = false);

2
Це працює в ядрі asp.net 3.0 і я можу легко використовувати це додавання веб-API
Tony Dong,

1
Рекомендується (на цій сторінці) використовувати services.AddRazorPages();замістьservices.AddMvc();
BurnsBA

1
Це хороше рішення, якщо ви проходите перший підручник mvc та оновлення з core2.1 до core3.0. Це вирішило моє питання негайно, дякую!
Спенсер Поллок

Варіант 3 відмінно підійшов для створення сторінки з голими кістками
Вік

50

Це працювало для мене (додайте Startup.cs> Метод ConfigureServices):

services.AddMvc (option => option.EnableEndpointRouting = false)

2
Проста відповідь, але чудова відповідь!
noobprogrammer

3

Проблема, яку я виявив, пов’язана з оновленнями в .NET Core. Остання версія .NET Core 3.0, що випускається, вимагає чіткого дозволу на використання MVC.

Ця проблема є найбільш помітною при спробі переходу зі старої .NET Core (2.2 або попередньої версії 3.0) до .NET Core 3.0

Якщо ви переходите з 2.2 на 3.0, використовуйте наведений нижче код, щоб виправити проблему.

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

Якщо ви використовуєте шаблон .NET Core 3.0,

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

Метод ConfigServices після виправлення, як показано нижче,

введіть тут опис зображення

Спасибі


2

Для DotNet Core 3.1

Використовуйте нижче

Файл: Configure public void Configure (додаток IApplicationBuilder, IHostingEnvironment env) {

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

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

Що робити з усіма лініями налаштування послуг?
Фанчі

0

Ви можете використовувати: у методі ConfigureServices:

services.AddControllersWithViews();

А для методу Налаштування:

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

0

Це працювало для мене .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();
    });
}

-4

Використовуйте нижче код

app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });

Це допоможе, якби ви пояснили, як цей код вирішує проблему.
Роберт Колумбія

Просто розміщення коду - недостатня відповідь. Поясніть, будь ласка, що / чому / як цей код відповість на питання.
медсестра

це просто плита котла, яка виходить з коробки, і насправді не допомагає користувачеві в тому, що вони є adter
Саймон Ціна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.