ไม่รองรับการใช้ 'UseMvc' เพื่อกำหนดค่า MVC ขณะใช้ Endpoint Routing


122

ฉันมีโครงการ Asp.Net core 2.2

เมื่อเร็ว ๆ นี้ฉันเปลี่ยนเวอร์ชันจาก. net core 2.2 เป็น. net core 3.0 Preview 8 หลังจากการเปลี่ยนแปลงนี้ฉันเห็นข้อความเตือนนี้:

ไม่รองรับการใช้ 'UseMvc' เพื่อกำหนดค่า MVC ขณะใช้ Endpoint Routing หากต้องการใช้ 'UseMvc' ต่อไปโปรดตั้งค่า 'MvcOptions.EnableEndpointRouting = false' ภายใน 'ConfigureServices'

ฉันเข้าใจว่าการตั้งค่าEnableEndpointRoutingเป็นเท็จฉันสามารถแก้ปัญหาได้ แต่ฉันจำเป็นต้องรู้ว่าอะไรคือวิธีที่เหมาะสมในการแก้ปัญหาและเหตุใด Endpoint Routing จึงไม่จำเป็นต้องมีUseMvc()ฟังก์ชัน


2
เกี่ยวกับวิธีที่เหมาะสม: เอกสารนี้ docs.microsoft.com/en-us/aspnet/core/migration/… ระบุว่า "ย้ายแอปไปยัง Endpoint Routing ถ้าเป็นไปได้"
dvitel

คำตอบ:


23

แต่ฉันต้องรู้ว่าอะไรคือวิธีที่เหมาะสมในการแก้ปัญหา

โดยทั่วไปแล้วคุณควรจะใช้EnableEndpointRoutingแทนUseMvcและคุณสามารถดูการปรับปรุงเส้นทางรหัสเริ่มต้นEnableEndpointRoutingสำหรับรายละเอียดขั้นตอนการเปิดใช้งาน

เหตุใด Endpoint Routing จึงไม่จำเป็นต้องใช้ฟังก์ชัน 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เพื่อกำหนดเส้นทางการร้องขอไปยังปลายทาง


129

ฉันพบวิธีแก้ปัญหาในเอกสารอย่างเป็นทางการต่อไปนี้ " โยกย้ายจาก 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. ปิดการใช้งานการกำหนดเส้นทางปลายทาง ตามที่ข้อความแสดงข้อยกเว้นแนะนำและตามที่กล่าวไว้ในส่วนต่อไปนี้ของเอกสารประกอบ: ใช้ mvcwithout endpoint Routing


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

2
ใช้งานได้ใน asp.net core 3.0 และฉันสามารถใช้เว็บ API เพิ่มได้อย่างง่ายดาย
Tony Dong

1
ขอแนะนำ (ในหน้านั้น) ให้ใช้services.AddRazorPages();แทนservices.AddMvc();
BurnsBA

1
นี่เป็นทางออกที่ดีหากคุณกำลังทำบทช่วยสอน mvc แรกและอัปเกรดจาก core2.1 เป็น core3.0 สิ่งนี้ช่วยแก้ปัญหาของฉันได้ทันทีขอบคุณ!
Spencer Pollock

ตัวเลือก 3 ทำงานได้ดีสำหรับฉันในการสร้างหน้ากระดูกที่เปลือยเปล่า
วิก


3

ปัญหาที่ฉันพบเกิดจากการอัปเดตบน. NET Core framework 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

ใช้ด้านล่าง

ไฟล์: Startup.cs โมฆะสาธารณะกำหนดค่า (แอป IApplicationBuilder, IHostingEnvironment env) {

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

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

จะทำอย่างไรกับสายการกำหนดค่าบริการทั้งหมด?
Fanchi

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

มันจะช่วยได้ถ้าคุณอธิบายว่าโค้ดนี้แก้ปัญหาได้อย่างไร
Robert Columbia

เพียงแค่การโพสต์โค้ดไม่ใช่คำตอบที่เพียงพอ โปรดอธิบายว่าอะไร / ทำไม / รหัสนี้จะตอบคำถามได้อย่างไร
nurdyguy

นี่เป็นเพียงจานหม้อไอน้ำที่ออกมาจากกล่องและไม่ได้ช่วยผู้ใช้จริง ๆ ด้วยการที่พวกเขาเป็นคนพูด
Simon Price
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.