Uç Nokta Yönlendirmesi kullanılırken MVC'yi yapılandırmak için "UseMvc" kullanımı desteklenmez


122

Asp.Net core 2.2 projem vardı.

Son zamanlarda, sürümü .net core 2.2'den .net core 3.0 Preview 8'e değiştirdim. Bu değişiklikten sonra şu uyarı mesajını görüyorum:

Endpoint Routing kullanılırken MVC'yi yapılandırmak için "UseMvc" kullanımı desteklenmez. 'UseMvc' kullanmaya devam etmek için lütfen 'ConfigureServices' içinde 'MvcOptions.EnableEndpointRouting = false' olarak ayarlayın.

EnableEndpointRoutingYanlış seçeneğine ayarlayarak sorunu çözebileceğimi anlıyorum , ancak sorunu çözmenin doğru yolunun ne olduğunu ve Endpoint Routing'in neden UseMvc()işleve ihtiyaç duymadığını bilmem gerekiyor .


2
uygun yol hakkında: bu docs.microsoft.com/en-us/aspnet/core/migration/… "mümkünse uygulamayı Uç Nokta Yönlendirmesine
geçir

Yanıtlar:


23

ama bunu çözmenin doğru yolunun ne olduğunu bilmem gerekiyor

Genel olarak, EnableEndpointRoutingbunun yerine kullanmalısınız UseMvcve etkinleştirmek için ayrıntılı adımlar için Güncelleme yönlendirme başlangıç ​​kodunu inceleyebilirsinizEnableEndpointRouting .

Endpoint Routing neden UseMvc () işlevine ihtiyaç duymuyor?

Çünkü UseMvckullanır the IRouter-based logicve EnableEndpointRoutingkullanır endpoint-based logic. Aşağıda bulunabilecek farklı mantığı takip ediyorlar:

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

İçin EnableEndpointRouting, isteği uç noktalara yönlendirmek için EndpointMiddleware kullanır .


129

Çözümü aşağıdaki resmi belgelerde buldum: " ASP.NET Core 2.2'den 3.0'a Geçiş ":

3 yaklaşım vardır:

  1. UseMvc veya UseSignalR'yi UseEndpoints ile değiştirin.

Benim durumumda sonuç şuna benziyordu

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

    }
}

VEYA
2. AddControllers () ve UseEndpoints () kullanın

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

    }
}

VEYA
3. Uç nokta Yönlendirmesini devre dışı bırakın. İstisna mesajının önerdiği ve belgelerin aşağıdaki bölümünde belirtildiği gibi: uç nokta yönlendirmesi olmadan mvc kullanın


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

2
Bu asp.net core 3.0'da çalışıyor ve bu add web API'sini kolayca kullanabilirim
Tony Dong

1
Bunun services.AddRazorPages();yerine ( bu sayfada) kullanılması services.AddMvc();
önerilir

1
İlk mvc eğitiminden geçiyor ve core2.1'den core3.0'a yükseltiyorsanız bu iyi bir çözümdür . Bu, sorunumu hemen çözdü, teşekkürler!
Spencer Pollock

3. seçenek, çıplak kemik sayfası oluşturmada benim için harika çalıştı
Vic

51

Bu benim için çalıştı (ekle Startup.cs > ConfigureServices yöntemini ):

services.AddMvc (seçenek => seçenek.EnableEndpointRouting = false)

2
Basit cevap, ama Harika cevap!
noobprogrammer

4

Bulduğum sorun .NET Core çerçevesindeki güncellemelerden kaynaklanıyor. Yayımlanan en son .NET Core 3.0 sürümü, MVC'yi kullanmak için açık bir katılım gerektirir.

Bu sorun en çok, eski .NET Core'dan (2.2 veya önizleme 3.0 sürümü) .NET Core 3.0'a geçiş yapılmaya çalışıldığında görülür.

2.2'den 3.0'a geçiş yapıyorsanız, sorunu çözmek için lütfen aşağıdaki kodu kullanın.

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

.NET Core 3.0 şablonu kullanıyorsanız,

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

Aşağıdaki gibi düzeltmeden sonra ConfigServices yöntemi,

görüntü açıklamasını buraya girin

Teşekkür ederim


2

DotNet Core 3.1 için

Aşağıda kullanın

Dosya: Startup.cs public void Configure (IApplicationBuilder uygulaması, IHostingEnvironment env) {

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

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

Tüm servis konfigürasyon satırları ile ne yapmalı?
Fanchi

0

Şunları kullanabilirsiniz: ConfigureServices yönteminde:

services.AddControllersWithViews();

Ve Yapılandırma yöntemi için:

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

0

Bu benim için .Net Core 3.1'de çalıştı.

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

    app.UseRouting();

    app.UseAuthorization();

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

-4

Aşağıdaki Kodu Kullanın

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

Bu kodun sorunu nasıl çözdüğünü açıklamanız yardımcı olacaktır .
Robert Columbia

Sadece kod göndermek yeterli bir cevap değildir. Lütfen bu kodun soruyu ne / neden / nasıl yanıtlayacağını açıklayınız
nurdyguy

bu sadece kutudan çıkan ve kullanıcıya adter oldukları konusunda yardımcı olmayan kazan plakasıdır
Simon Price
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.