मार्ग संग्रह में "x" नाम का मार्ग पहले से ही है। रूट के नाम अद्वितीय होने चाहिए। ASP.NET MVC 3 के साथ अपवाद


98

मैं एक ASP.NET MVC 3 वेब सेवा कर रहा हूं और मुझे यह अपवाद रुक-रुक कर मिलता रहा है।

स्टैक ट्रेस:

Server Error in '/' Application.

A route named 'ListTables' is already in the route collection. Route names must be unique.
Parameter name: name

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: A route named 'ListTables' is already in the route collection. Route names must be unique.
Parameter name: name

Source Error: 


Line 24:            //     }
Line 25:            // );
Line 26:             context.MapRoute(
Line 27:                 "ListTables",
Line 28:                 // example: 

Source File: C:\inetpub\wwwroot\SchemaBrowserService\Website\Areas\Api\ApiAreaRegistration.cs    Line: 26 

Stack Trace: 


[ArgumentException: A route named 'ListTables' is already in the route collection. Route names must be unique.
Parameter name: name]
   System.Web.Routing.RouteCollection.Add(String name, RouteBase item) +2329682
   System.Web.Mvc.RouteCollectionExtensions.MapRoute(RouteCollection routes, String name, String url, Object defaults, Object constraints, String[] namespaces) +236
   System.Web.Mvc.AreaRegistrationContext.MapRoute(String name, String url, Object defaults, Object constraints, String[] namespaces) +59
   System.Web.Mvc.AreaRegistrationContext.MapRoute(String name, String url, Object defaults) +17
   SchemaBrowserService.Areas.Api.ApiAreaRegistration.RegisterArea(AreaRegistrationContext context) in C:\inetpub\wwwroot\SchemaBrowserService\Website\Areas\Api\ApiAreaRegistration.cs:26
   System.Web.Mvc.AreaRegistration.CreateContextAndRegister(RouteCollection routes, Object state) +105
   System.Web.Mvc.AreaRegistration.RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, Object state) +199
   System.Web.Mvc.AreaRegistration.RegisterAllAreas(Object state) +45
   System.Web.Mvc.AreaRegistration.RegisterAllAreas() +6
   Website.MvcApplication.Application_Start() in C:\Users\djackson\Downloads\RestApiMvc3\Website\Website\Global.asax.cs:35

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272

यह शायद इस तथ्य से संबंधित है कि रूट डिबगर से पता चलता है कि मेरे पास कुछ पुराने मार्ग हैं जिन्हें मैंने संशोधित किया है या हटा दिया है और दूर नहीं जाएगा (यहां तक ​​कि मेरी मशीन को रिबूट करने के बाद भी)। स्टैक ट्रेस एक स्रोत फ़ाइल को भी संदर्भित करता है जो लंबे समय से हटा दिया गया है और मेरे ऐप को तब से एक नए स्थान पर ले जाया गया है, साफ किया गया है और फिर से बनाया गया है। मैं क्या खो रहा हूँ?

यहाँ मेरा मार्ग पंजीकरण कोड है:

// in Global.asax.cs:
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        "Default2", // Route name
        "Api/{controller}/{action}/{id}", // URL with parameters
        new { controller = "DataSource", action = "Index", area = "Api", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
}

// in ApiAreaRegistration.cs:
public class ApiAreaRegistration : AreaRegistration
{
    public override string AreaName { get { return "Api"; } }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        // DataSources

        // Tables
        context.MapRoute(
            "ListTables",
            // example: 
            // /api/DataSources/DataSource/1/schemata/schema/dbo/tables
               "Api/DataSources/DataSource/{dataSourceId}/schemata/{schemaName}/tables",
            new
            {
                controller = "Tables",
                action = "TableList",
                schemaName = "dbo",
                dataSourceId = "DefaultId"
            }
        );


        // Schemata
        context.MapRoute(
          "Schema",
            // example: 
            // /api/DataSources/DataSource/1/schemata/schema/dbo
              "Api/DataSources/DataSource/{dataSourceId}/schemata/{schemaName}",
          new
          {
              controller = "Schema",
              action = "Schema",
              dataSourceId = "DefaultId",
              schemaName = UrlParameter.Optional
          }
       );

       // // DataSources
        context.MapRoute(
            "SingleDataSource",
            "Api/DataSources/DataSource/{dataSourceId}",
            new
            {
                controller = "DataSource",
                action = "DataSource",
                dataSourceId = UrlParameter.Optional
            }
        );
        context.MapRoute(
            "ListDataSources",
            "Api/DataSources",
            new
            {
                controller = "DataSource",
                action = "DataSourceList",
                dataSourceId = "DefaultId"
            }
        );
        context.MapRoute(
             "Api_default",
             "Api/{controller}/{action}/{id}",
             new { action = "Index", id = UrlParameter.Optional }
        );

    }
}

क्या आपके पास कोई अन्य स्थान है जो आपने परिभाषित मार्ग है? क्षेत्र?
श्यजु

मैंने स्टैक ट्रेस को जोड़ा और अपने मार्गों के बारे में अतिरिक्त जानकारी जोड़ी।
Rn222

जवाबों:


297

इस समस्या को ठीक करने के लिए मुझे अपने प्रोजेक्ट पर बिन फ़ोल्डर में जाना पड़ा, सभी DLL फ़ाइलों को हटाना और फिर पुनर्निर्माण करना और इस समस्या को ठीक किया।


11
बस समाधान की सफाई हम एक ही काम करते हैं।
फाबियो मिल्हीरो

84
@Bomboca - सफाई परियोजना का हिस्सा नहीं है कि DLL को नष्ट नहीं करता है। उदाहरण के लिए, यदि आपने अपने प्रोजेक्ट का असेंबली नाम बदल दिया है, तो पुराना असेंबली binफ़ोल्डर में रहेगा ।
जोश एम।

2
मैं एक ही मुद्दे का सामना कर रहा था और इससे मेरी समस्या तुरंत हल हो गई। धन्यवाद!
अलुआन हदाद

1
मेरे प्रोजेक्ट का नाम दिया, और पुराने DLL अभी भी बिन फ़ोल्डर में था। कृपया लोगों को: स्थायी समाधान, जब प्रकाशन, पहले लक्ष्य निर्देशिका में सभी फ़ाइलों को हटा दें! (निर्देशिका में प्रकाशित होने पर विकल्प)
स्टिजन्स्पाइज़र

2
मुझे नहीं पता लेकिन क्यों "स्वच्छ समाधान" मेरे लिए काम नहीं करता है। आपका समाधान काम करता है।
user2980426

19

यह त्रुटि कई कारणों से हो सकती है, मेरे पास एक ही त्रुटि थी और Global.asax वर्ग को संशोधित करके इसे हल किया।

Global.asax.cs पर Application_Start पद्धति इस प्रकार थी:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

निम्न विधि इस विधि में दो बार होती है:

RouteConfig.RegisterRoutes(RouteTable.Routes);

यह सुनिश्चित करता है कि मार्ग दो बार रूट सूची में जोड़ा गया था और एक ही समय में त्रुटि का कारण बना।

मैंने निम्नानुसार Application_Start पद्धति को बदल दिया और त्रुटि गायब हो गई:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

यह आपकी समस्या का जवाब नहीं हो सकता है, लेकिन भविष्य में शायद दूसरों की मदद कर सकता है। मुझे दूसरों के बीच यह जवाब नहीं दिखाई दिया, इसलिए मैंने इसे जोड़ने का फैसला किया।


2
AreaRegistration.RegisterAllAreas () के लिए भी डुप्लिकेट कॉल है।
स्पाइवोनियस

इसके अलावा, मैं इसमें भाग लिया: WebApiConfig.Register (GlobalConfiguration.Configuration); GlobalConfiguration.Configure (WebApiConfig.Register) के साथ; दोनों WebApiConfig.cs में समान विधि बुला रहे हैं। ट्रिक निश्चित रूप से एक ब्रेक लगाने के लिए है जहां मार्ग का नाम सेट किया जा रहा है और कॉल स्टैक को देखें।
रीड

मुझे यह त्रुटि मिल रही थी और अन्य समाधानों में से किसी ने भी मेरे लिए काम नहीं किया, लेकिन फिर मुझे डुप्लिकेट AreaRegistration.RegisterAllAreas () मिला; मेरे Global.asax फ़ाइल में लाइनें। उनमें से एक को हटाने से त्रुटि दूर हो गई।
14

10

मुझे पता चला कि Global.asax नाम बदलने से पहले साइट के DLL फ़ाइल के पुराने संस्करण का उल्लेख कर रहा था। DLL को तब साफ नहीं किया जा रहा था जब मैंने बिल्ड> क्लीन अप किया था क्योंकि वीएस प्रोजेक्ट / सॉल्यूशन ने इसे किसी भी तरह से संदर्भित नहीं किया था। ऐसा लगता है कि कभी-कभी केवल DLL के नए संस्करण का उपयोग किया जा रहा था, जिससे साइट सही ढंग से काम कर सके, लेकिन अंततः दोनों को लोड किया जाएगा, जिससे मार्ग संघर्ष हो जाएगा।


मेरे प्रोजेक्ट का नाम बदलने के बाद बिन और ओजे को हटाने ने मेरे लिए काम किया।
स्टीव

3
आपको कैसे पता चला Global.asax एक पुराने DLL की बात कर रहा था?
xaisoft

@xiasoft: पुराने DLL में वे रूट थे जिन्हें मैंने डिलीट कर दिया था लेकिन रूट डेबगर ने दिखाया कि वे अभी भी वहां थे। जब मैंने पुराने DLL को हटाया तो पुराने मार्गों को भी हटा दिया गया।
Rn222

4

मार्ग AppDomain.CurrentDomain के भीतर सभी असेंबली से लोड होते हैं, इसलिए यदि आपकी पुरानी असेंबली अभी भी उसी का हिस्सा हैं, तो आप अभी भी पुराने / डुप्लीकेट रूट प्राप्त कर सकते हैं।


3
मैं यह देखने के लिए कैसे जांच सकता हूं कि क्या यह समस्या है?
Rn222

ये सही है। यह मेरे प्रोजेक्ट पर खुशी है। जब मैंने इसका नाम बदला, तो यह त्रुटि हुई। पुरानी असेंबली को हटाने के बाद, त्रुटि चली गई है।
बफ़सर

3

मेरे मामले में, मुझे इस मुद्दे का सामना करना पड़ा, जब मैंने समाधान से एक अन्य परियोजना का संदर्भ जोड़ा, जो एमवीसी भी था और क्षेत्र में समान नामों का उपयोग करता है (मैं इस परियोजना को जोड़ना नहीं चाहता था, मुझे नहीं पता कि यह कैसे हुआ )। जब मैंने इस DLL को हटा दिया, तो प्रोजेक्ट ने काम करना शुरू कर दिया।


यह मेरे साथ भी नहीं हुआ था कि ऐसा हो सकता है, क्योंकि मैंने हमेशा अपनी साइट परियोजनाओं को एक दर्जन टुकड़ों में विभाजित करने के बजाय "क्योंकि वास्तुकला" के रूप में आत्म-निहित रखा है। नई टीम, नए सम्मेलन, नए विकल्प जो मुझे अभी तक उपयोगी नहीं मिले थे, उनमें से कुछ को आंतरिक बनाने के लिए।
ब्रिचिन्स

2

अकेले DLL को हटाने से मेरे (VS2013 में) काम नहीं हुआ, लेकिन संपूर्ण 'बिन' और 'obj' फोल्डर को डिलीट करना और फिर समाधान का निर्माण करना पूरी तरह से काम कर गया! मुझे लगता है मुझे लगता है मैं इसे ठीक करने की कोशिश कर रहा खर्च नहीं किया था ...


1

किसी भी सुझाव ने मेरे लिए काम नहीं किया। आगे बढ़े और वेब सर्वर (इस मामले में IIS) को पुनः आरंभ किया और कोड को ठीक करने के बाद त्रुटि को साफ किया। DLL को IIS में कैश किया गया होगा।


1

इस कोड को आज़माएं, केवल नाम बदलें

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapHttpRoute(
          name: "API",
          routeTemplate: "api/{controller}/{action}",
          defaults: new { action = "GetAgentId" }
      );

0

मुझे वही त्रुटि मिल रही है। लेकिन आखिरकार मुझे समाधान मिल गया है। परिदृश्य: मैं अपने वेब एपीआई mvc4 एप्लिकेशन में अलग (mvc4 एप्लिकेशन) dll जोड़ रहा हूं। जब चलाने की कोशिश करें। मुझे वही त्रुटि मिल रही है। मूल कारण- जब मेरा वेब एप्‍लीकेशन रन करता है। एप्‍लीकेशन स्‍वयं से सभी क्षेत्र को रजिस्‍टर करता है और वर्तमान एप्‍लीकेशन डोमेन dll संदर्भ में लोड करना शुरू करता है। जब अनुप्रयोग लोड dll (MVC4 अनुप्रयोग) उस समय त्रुटि हो रही है क्योंकि वर्तमान मेप्राउट पहले से ही "हेल्पपेज_डिफॉल्ट" के लिए कुंजी जोड़ते हैं।

उपाय। 1. वर्तमान मानचित्र या मौजूदा एप्लिकेशन (रेफर डीएल) को मैपआउट में रजिस्टरअरे के लिए बदलें। 2.Move कोड dll (mvc4 एप्लिकेशन) कोड अलग-अलग स्वतंत्रता के लिए और नए dll को देखें।


0

मैं AttributeRoutingHttpConfig.Start()अपने Global.asax में मैन्युअल रूप से कॉल कर रहा था । इस ऑटो-जनरेटेड लाइन को फ़ाइल के शीर्ष पर ध्यान नहीं दिया जो इसे स्वचालित रूप से कहता है।

[assembly: WebActivator.PreApplicationStartMethod(typeof(Mev.Events.Web.AttributeRoutingHttpConfig), "Start")]

0

मेरे पास एक एप्लिकेशन था जो एक फॉर्म ऐप था जो प्रमाणीकरण के लिए उपयोग किए जाने वाले तीसरे पक्ष के घटक के साथ MVC में माइग्रेट किया गया था जो किसी अन्य साइट पर रीडायरेक्ट किया गया था। यदि उपयोगकर्ता पहले से लॉग इन नहीं था (एक बार साइट के लिए प्रारंभिक कनेक्शन के लिए और एक बार वापसी के लिए) घटक दो बार एक सत्र शुरू करेगा। इसलिए मैंने इसे निम्नलिखित कोड के साथ हल किया:

if (routes.Count < 3)
            {
                routes.IgnoreRoute("login.aspx");
                routes.IgnoreRoute("default.aspx");
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new {action = "Index", id = UrlParameter.Optional}
                    );
            }


0

बिन फ़ोल्डर में dlls को हटाने से 100% काम हुआ, मुझे अभी भी पुनर्निर्माण के लिए आवश्यक मेरी परियोजना dlls थी। बल्कि बिन फोल्डर की एक प्रति बनाएँ। फिर मूल को हटाएं। परियोजना का निर्माण करें। यदि यह विफल रहता है, तो बिन फ़ोल्डर में गुम dlls रखें।


0

मैं एक पुरानी MVC2 वेबसाइट चला रहा था और मुझे यह मुद्दा मिला क्योंकि IIS 'प्रबंधित पाइपलाइन मोड' डिफ़ॉल्ट रूप से 'इंटीग्रेटेड' (प्रोजेक्ट पर F4 दबाएं) पर सेट किया गया था। इसे 'क्लासिक' में बदलकर मुद्दा तय किया


0

Azure App Service में प्रकाशित होने पर मुझे पुराने प्रोजेक्ट DLL और सिंबल फ़ाइलों को हटाने के लिए पब्लिश डायलॉग की "सेटिंग्स" -> "फाइल पब्लिश ऑप्शन्स" -> "अतिरिक्त फाइलों को गंतव्य पर निकालें" की जांच करनी थी। तब साइट लोड होगी।

यह मूल रूप से वर्तमान उत्तर (Fleas) का समाधान है। अपमानजनक DLL को हटाएं।

इस पुराने DLL को बनाए रखने के कारण क्या मैं वेबसाइट के पुराने संस्करण (MVC 3 ~ 5 टेम्प्लेट) को लोड कर रहा था, लेकिन नाम बदलने के साथ अलग वेब प्रोजेक्ट, क्योंकि नया संस्करण इस प्रोजेक्ट की एक प्रति था जिसने हाल के दिनों में कुछ बिंदु बनाए। ) नए प्रोजेक्ट के DLL को केवल हटाने की आवश्यकता है। इसे प्राप्त करने के विभिन्न तरीके हैं। मैंने एक संवाद का उपयोग करते हुए सबसे आसान एटीएम होने का पता लगाया। फ़ाइल सिस्टम में लॉग इन करना और फ़ाइलों को हाथ से निकालना निश्चित रूप से भी काम करता है।

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