Menggunakan 'UseMvc' untuk mengkonfigurasi MVC tidak didukung saat menggunakan Perutean Endpoint

120

Saya memiliki proyek Asp.Net core 2.2.

Baru-baru ini, saya mengubah versi dari .net core 2.2 ke .net core 3.0 Preview 8. Setelah perubahan ini saya melihat pesan peringatan ini:

menggunakan 'UseMvc' untuk mengkonfigurasi MVC tidak didukung saat menggunakan Perutean Endpoint. Untuk terus menggunakan 'UseMvc', setel 'MvcOptions.EnableEndpointRouting = false' di dalam 'ConfigureServices'.

Saya memahami bahwa dengan menyetel EnableEndpointRoutingke false saya dapat menyelesaikan masalah, tetapi saya perlu tahu apa cara yang tepat untuk menyelesaikannya dan mengapa Perutean Titik Akhir tidak memerlukan UseMvc()fungsi.

Mehrdad Babaki
sumber
2
tentang cara yang benar: docs.microsoft.com/en-us/aspnet/core/migration/… doc ini menyatakan "migrasi aplikasi ke Endpoint Routing jika memungkinkan"
dvitel

Jawaban:

23

tapi saya perlu tahu cara yang tepat untuk mengatasinya

Secara umum, Anda harus menggunakan EnableEndpointRoutingbukan UseMvc, dan Anda bisa merujuk Perbarui perutean kode startup untuk detail langkah-langkah untuk mengaktifkan EnableEndpointRouting.

mengapa Endpoint Routing tidak membutuhkan fungsi UseMvc ().

Untuk UseMvc, itu menggunakan the IRouter-based logicdan EnableEndpointRoutingmenggunakan endpoint-based logic. Mereka mengikuti logika berbeda yang dapat ditemukan di bawah ini:

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

Karena EnableEndpointRouting, ia menggunakan EndpointMiddleware untuk merutekan permintaan ke titik akhir.

Edward
sumber
123

Saya menemukan solusinya, dalam dokumentasi resmi berikut " Migrasi dari ASP.NET Core 2.2 ke 3.0 ":

Ada 3 pendekatan:

  1. Ganti UseMvc atau UseSignalR dengan UseEndpoints.

Dalam kasus saya, hasilnya terlihat seperti itu

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

    }
}

ATAU
2. Gunakan AddControllers () dan 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();
        });

    }
}

ATAU
3. Nonaktifkan Perutean titik akhir. Seperti yang disarankan pesan pengecualian dan seperti yang disebutkan di bagian dokumentasi berikut: gunakan mvctanpa perutean titik akhir


services.AddMvc(options => options.EnableEndpointRouting = false);
//OR
services.AddControllers(options => options.EnableEndpointRouting = false);
Sergii Zhuravskyi
sumber
2
Ini berfungsi di asp.net core 3.0 dan saya dapat menggunakan add web API ini dengan mudah
Tony Dong
1
Ini direkomendasikan (pada halaman itu) untuk penggunaan services.AddRazorPages();bukannyaservices.AddMvc();
BurnsBA
1
Ini adalah solusi yang bagus jika Anda melalui tutorial MVC pertama dan meningkatkan dari core2.1 ke core3.0. Ini segera menyelesaikan masalah saya, terima kasih!
Spencer Pollock
opsi 3 bekerja sangat baik bagi saya dalam membangun halaman tanpa tulang
Vic
50

Ini berhasil untuk saya (tambahkan Startup.cs> metode ConfigureServices):

services.AddMvc (option => option.EnableEndpointRouting = false)
Bonaventura72
sumber
2
Jawaban sederhana, tapi Jawaban yang bagus!
noobprogrammer
3

Masalah yang saya temukan adalah karena pembaruan pada kerangka .NET Core. Versi rilis terbaru .NET Core 3.0 memerlukan keikutsertaan eksplisit untuk menggunakan MVC.

Masalah ini paling terlihat ketika seseorang mencoba untuk bermigrasi dari .NET Core yang lebih lama (2.2 atau versi pratinjau 3.0) ke .NET Core 3.0

Jika bermigrasi dari 2.2 ke 3.0, harap gunakan kode di bawah ini untuk memperbaiki masalah.

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

Jika menggunakan template .NET Core 3.0,

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

Metode ConfigServices setelah diperbaiki seperti di bawah ini,

masukkan deskripsi gambar di sini

Terima kasih

Akash Limbani
sumber
2

Untuk DotNet Core 3.1

Gunakan di bawah ini

File: Startup.cs public void Configure (aplikasi IApplicationBuilder, IHostingEnvironment env) {

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

        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthentication();
        app.UseHttpsRedirection();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
sagar charde
sumber
Apa yang harus dilakukan dengan semua baris konfigurasi layanan?
Fanchi
0

Anda dapat menggunakan: dalam metode ConfigureServices:

services.AddControllersWithViews();

Dan untuk metode Konfigurasi:

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

Ini bekerja untuk saya di .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
sumber
-4

Gunakan Kode Di Bawah Ini

app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
Mandy
sumber
Ini akan membantu jika Anda menjelaskan bagaimana kode ini menyelesaikan masalah.
Robert Columbia
Hanya memposting kode bukanlah jawaban yang cukup. Tolong jelaskan apa / mengapa / bagaimana kode ini akan menjawab pertanyaan.
nurdyguy
ini hanya pelat ketel yang keluar dari kotak dan tidak benar-benar membantu pengguna dengan apa yang mereka patuhi
Simon Price