समापन बिंदु रूटिंग का उपयोग करते समय MVC को कॉन्फ़िगर करने के लिए 'UseMvc' का उपयोग करना समर्थित नहीं है


119

मेरे पास एक Asp.Net कोर 2.2 परियोजना थी।

हाल ही में, मैंने .net कोर 2.2 से .net कोर 3.0 पूर्वावलोकन का संस्करण बदल दिया। 8. इस परिवर्तन के बाद मुझे यह चेतावनी संदेश दिखाई देता है:

MVC को कॉन्फ़िगर करने के लिए 'UseMvc' का उपयोग करना एंडपॉइंट रूटिंग का उपयोग करते समय समर्थित नहीं है। 'UseMvc' का उपयोग जारी रखने के लिए, कृपया 'ConfigureServices' के अंदर 'MvcOptions.EnableEndpointRout = false' सेट करें।

मैं समझता हूं कि EnableEndpointRoutingगलत पर सेट करने से मैं समस्या को हल कर सकता हूं, लेकिन मुझे यह जानना होगा कि इसे हल करने का उचित तरीका क्या है और एंडपॉइंट रूटिंग को UseMvc()फ़ंक्शन की आवश्यकता क्यों नहीं है ।


2
उचित तरीके के बारे में: यह डॉक्टर docs.microsoft.com/en-us/aspnet/core/migration/… "संभव होने पर एप्लिकेशन को एंडपॉइंट रूटिंग के लिए माइग्रेट करता है"
DVitel

जवाबों:


23

लेकिन मुझे यह जानना होगा कि इसे हल करने का उचित तरीका क्या है

सामान्य तौर पर, आपको EnableEndpointRoutingइसके बजाय उपयोग करना चाहिए UseMvc, और आप सक्षम करने के लिए विस्तार चरणों के लिए अपडेट रूटिंग स्टार्टअप कोड को संदर्भित कर सकते हैं EnableEndpointRouting

Endpoint रूटिंग को 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, यह एंडपॉइंट करने के लिए अनुरोध को रूट करने के लिए एंडपॉइंट मैडलवेयर का उपयोग करता है ।


122

मुझे इसका समाधान मिला, निम्नलिखित आधिकारिक दस्तावेज में " ASP.NET कोर 2.2 से 3.0 में माइग्रेट करें ":

3 दृष्टिकोण हैं:

  1. UseEndpoint के साथ UseMvc या UseSignalR को बदलें।

मेरे मामले में, परिणाम जैसा दिखता था

  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 () और UseEndpoint () का उपयोग करें

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 समापन बिंदु रूटिंग का उपयोग करें


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

2
यह asp.net core 3.0 में काम करता है और मैं इस ऐड वेब एपीआई को आसानी से इस्तेमाल कर सकता हूं
टोनी डोंग

1
इसके services.AddRazorPages();बजाय (उस पृष्ठ पर) का उपयोग करने की सिफारिश की जाती हैservices.AddMvc();
बर्न्सबीए

1
यदि आप पहले mvc ट्यूटोरियल से गुजर रहे हैं और core2.1 से core3.0 में अपग्रेड कर रहे हैं तो यह एक अच्छा उपाय है । इसने मेरी समस्या को तुरंत हल कर दिया, धन्यवाद!
स्पेन्सर पोलक

विकल्प 3 ने मेरे लिए नंगे हड्डियों के पेज बनाने में बहुत काम किया
विक

50

इसने मेरे लिए काम किया (ऐड इन Startup.csकॉन्फिगर सर्विसेज विधि):

सेवाएं। AdMvc (विकल्प => विकल्प ।EnableEndpointRout = false)

2
सरल उत्तर, लेकिन महान जवाब!
noobprogrammer

SAY HOW THIS CODE SOLVES, मुझे समाधान की कोई परवाह नहीं है, मुझे पहले से ही पता था, मैं WHY और HOW जानना चाहता हूँ ...
अमीर होसैन अहमदी

3

.NET कोर फ्रेमवर्क के अपडेट के कारण मुझे जो समस्या मिली थी। नवीनतम .NET कोर 3.0 जारी संस्करण को एमवीसी का उपयोग करने के लिए स्पष्ट ऑप्ट-इन की आवश्यकता होती है।

यह समस्या सबसे अधिक दिखाई देती है जब कोई .NET .NET 3.0 से पुराने .NET कोर (2.2 या पूर्वावलोकन 3.0 संस्करण) से माइग्रेट करने का प्रयास करता है

यदि 2.2 से 3.0 की ओर पलायन हो रहा है, तो कृपया समस्या को ठीक करने के लिए नीचे दिए गए कोड का उपयोग करें।

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

यदि .NET कोर 3.0 टेम्पलेट का उपयोग किया जाता है,

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

नीचे के रूप में तय करने के बाद विन्यास विधि,

यहां छवि विवरण दर्ज करें

धन्यवाद


2

डॉटनेट कोर 3.1 के लिए

नीचे उपयोग करें

फ़ाइल: Startup.cs सार्वजनिक शून्य कॉन्फिगर (IApplicationBuilder ऐप, IHostingEnvironment कांग्रेस)

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

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

सभी सेवाओं कॉन्फ़िगरेशन लाइनों के साथ क्या करना है?
फैची

0

आप का उपयोग कर सकते हैं: कॉन्फ़िगर विधि विधि में:

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

यदि यह समझाया जाए कि यह कोड समस्या को हल कैसे करता है तो यह मदद करेगा ।
रॉबर्ट कोलंबिया

बस कोड पोस्ट करना एक पर्याप्त जवाब नहीं है। कृपया बताएं कि यह कोड क्या / क्यों / कैसे प्रश्न का उत्तर देगा।
नर्सरी गुप्ता

यह सिर्फ बॉयलर प्लेट है जो बॉक्स से बाहर आती है और वास्तव में उपयोगकर्ता की मदद नहीं करती है क्योंकि वे एड्टर हैं
साइमन मूल्य
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.