Sử dụng 'UseMvc' để định cấu hình MVC không được hỗ trợ khi sử dụng Định tuyến điểm cuối


119

Tôi đã có một dự án Asp.Net core 2.2.

Gần đây, tôi đã thay đổi phiên bản từ .net core 2.2 sang .net core 3.0 Preview 8. Sau khi thay đổi này, tôi thấy thông báo cảnh báo sau:

sử dụng 'UseMvc' để định cấu hình MVC không được hỗ trợ khi sử dụng Định tuyến điểm cuối. Để tiếp tục sử dụng 'UseMvc', vui lòng đặt 'MvcOptions.EnableEndpointRouting = false' bên trong 'ConfigureServices'.

Tôi hiểu rằng bằng cách đặt EnableEndpointRoutingthành false, tôi có thể giải quyết vấn đề, nhưng tôi cần biết cách thích hợp để giải quyết nó là gì và tại sao Định tuyến điểm cuối không cần UseMvc()chức năng.


2
về cách thích hợp: tài liệu này docs.microsoft.com/en-us/aspnet/core/migration/… tuyên bố "di chuyển ứng dụng sang Định tuyến điểm cuối nếu có thể"
dvitel

Câu trả lời:


23

nhưng tôi cần biết cách thích hợp để giải quyết nó là gì

Nói chung, bạn nên sử dụng EnableEndpointRoutingthay thế UseMvcvà bạn có thể tham khảo Cập nhật mã khởi động định tuyến để biết các bước chi tiết để kích hoạt EnableEndpointRouting.

tại sao Định tuyến điểm cuối không cần hàm UseMvc ().

Đối với UseMvc, nó sử dụng the IRouter-based logicEnableEndpointRoutingsử dụng endpoint-based logic. Chúng đang tuân theo các logic khác nhau có thể tìm thấy bên dưới:

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

Đối với EnableEndpointRouting, nó sử dụng EndpointMiddleware để định tuyến yêu cầu đến các điểm cuối.


121

Tôi đã tìm thấy giải pháp, trong tài liệu chính thức sau " Di chuyển từ ASP.NET Core 2.2 sang 3.0 ":

Có 3 cách tiếp cận:

  1. Thay thế UseMvc hoặc UseSignalR bằng UseEndpoints.

Trong trường hợp của tôi, kết quả trông giống như vậy

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

    }
}

HOẶC
2. Sử dụng AddControllers () và 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();
        });

    }
}

HOẶC
3. Tắt Định tuyến điểm cuối. Như thông báo ngoại lệ đề xuất và như đã đề cập trong phần sau của tài liệu: sử dụng mvc mà không cần định tuyến điểm cuối


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

2
Này hoạt động trong asp.net lõi 3.0 và tôi có thể sử dụng API add web này một cách dễ dàng
Tony Đồng

1
Nó được khuyến nghị (trên trang đó) sử dụng services.AddRazorPages();thay vìservices.AddMvc();
BurnsBA

1
Đây là một giải pháp tốt nếu bạn đang xem qua hướng dẫn mvc đầu tiên và nâng cấp từ core2.1 lên core3.0. Điều này đã giải quyết vấn đề của tôi ngay lập tức, cảm ơn!
Spencer Pollock

lựa chọn 3 đã làm việc tuyệt vời cho tôi trong việc xây dựng một trang xương trần
Vic

50

Điều này làm việc cho tôi (thêm vào Startup.cs> phương thức ConfigureServices):

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

2
Câu trả lời đơn giản, nhưng câu trả lời tuyệt vời!
noobprogrammer

NÓI CÁCH GIẢI QUYẾT MÃ NÀY, tôi không quan tâm đến giải pháp, tôi đã biết nó, tôi muốn biết TẠI SAO và LÀM THẾ NÀO ...
Amir Hossein Ahmadi

3

Vấn đề tôi phát hiện là do các bản cập nhật trên .NET Core framework. Phiên bản .NET Core 3.0 mới nhất được phát hành yêu cầu chọn tham gia rõ ràng để sử dụng MVC.

Sự cố này dễ thấy nhất khi một người cố gắng di chuyển từ .NET Core cũ hơn (phiên bản 2.2 hoặc bản xem trước 3.0) sang .NET Core 3.0

Nếu di chuyển từ 2.2 sang 3.0, vui lòng sử dụng mã bên dưới để khắc phục sự cố.

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

Nếu sử dụng mẫu .NET Core 3.0,

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

Phương thức ConfigServices sau khi sửa chữa như bên dưới,

nhập mô tả hình ảnh ở đây

Cảm ơn bạn


2

Đối với DotNet Core 3.1

Sử dụng bên dưới

Tệp: Startup.cs public void Configure (ứng dụng IApplicationBuilder, IHostingEnosystem env) {

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

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

Làm gì với tất cả các dòng cấu hình dịch vụ?
Fanchi

0

Bạn có thể sử dụng: trong phương thức ConfigureServices:

services.AddControllersWithViews();

Và đối với phương pháp Định cấu hình:

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

0

Điều này đã làm việc cho tôi trên .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

Sử dụng mã bên dưới

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

Sẽ hữu ích nếu bạn giải thích cách mã này giải quyết vấn đề.
Robert Columbia

Chỉ đơn giản là đăng mã không phải là một câu trả lời đầy đủ. Vui lòng giải thích cái gì / tại sao / như thế nào mã này sẽ trả lời câu hỏi.
nurdyguy

đây chỉ là tấm nồi hơi mà đi ra khỏi hộp và doesnt thực sự giúp cho người dùng rằng họ là adter
Simon Giá
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.