Uma rota chamada “x” já está na coleção de rotas. Os nomes das rotas devem ser exclusivos. Exceção com ASP.NET MVC 3


98

Estou fazendo um serviço da Web ASP.NET MVC 3 e continuo recebendo essa exceção intermitentemente.

Rastreamento de pilha:

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

Provavelmente está relacionado ao fato de que o Route Debugger mostra que tenho algumas rotas antigas que modifiquei ou excluí e não irão embora (mesmo depois de reiniciar minha máquina). O rastreamento de pilha também se refere a um arquivo de origem que há muito foi excluído e meu aplicativo foi movido para um novo local, limpo e reconstruído desde então. o que estou perdendo?

Aqui está todo o meu código de registro de rota:

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

    }
}

Você tem outro lugar onde você definiu rotas? Áreas?
Shyju

Eu adicionei o rastreamento de pilha e acrescentei informações adicionais sobre minhas rotas.
Rn 222

Respostas:


297

Para corrigir esse problema, tive que ir para a pasta bin no meu projeto, excluir todos os arquivos DLL e, em seguida, reconstruir e isso corrigiu o problema.


11
Simplesmente limpando a solução, fazemos a mesma coisa.
Fabio Milheiro

84
@Bomboca - a limpeza não apaga DLLs que não fazem parte do projeto. Por exemplo, se você alterou o nome da montagem do seu projeto, a montagem antiga permaneceria na binpasta.
Josh M.

2
Eu estava tendo o mesmo problema e isso resolveu meu problema imediatamente. Obrigado!
Aluan Haddad

1
Meu projeto foi renomeado e a DLL antiga ainda estava na pasta bin. Por favor pessoal: solução permanente, ao PUBLICAR, apague todos os arquivos do diretório de destino primeiro! (opção ao publicar no diretório)
StijnSpijker

2
Não sei por que, mas "Solução limpa" não funciona para mim. Sua solução funciona.
user2980426

19

Este erro pode ocorrer devido a várias causas, eu tive o mesmo erro e resolvi modificando a classe Global.asax.

O método Application_Start em Global.asax.cs era assim:

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

A seguinte linha ocorre duas vezes neste método:

RouteConfig.RegisterRoutes(RouteTable.Routes);

Isso garantiu que a rota fosse adicionada duas vezes à lista de rotas e, ao mesmo tempo, causasse o erro.

Mudei o método Application_Start da seguinte maneira e o erro desapareceu:

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

Esta pode não ser a resposta para o seu problema, mas talvez possa ajudar outras pessoas no futuro. Não vi essa resposta entre os outros, então decidi adicionar isso.


2
Também há uma chamada duplicada para AreaRegistration.RegisterAllAreas ().
Spivonious

Além disso, encontrei este: WebApiConfig.Register (GlobalConfiguration.Configuration); com GlobalConfiguration.Configure (WebApiConfig.Register); ambos chamando o mesmo método em WebApiConfig.cs. O truque é, claro, colocar uma pausa onde o nome da rota está sendo definido e olhar para a pilha de chamadas.
Reid,

Eu estava recebendo este erro e nenhuma das outras soluções funcionou para mim, mas então encontrei AreaRegistration.RegisterAllAreas () duplicado; linhas em meu arquivo global.asax. Remover um deles removeu o erro.
ewomack

10

Eu descobri que Global.asax estava se referindo a uma versão antiga do arquivo DLL do site antes de renomeá-lo. A DLL não estava sendo limpa quando eu fiz Build> Clean up porque o projeto / solução VS não se referia mais a ela. Parece que às vezes apenas a versão mais recente da DLL estava sendo usada, permitindo que o site funcionasse corretamente, mas eventualmente ambos seriam carregados causando os conflitos de rota.


excluir bin e obj funcionou para mim depois de renomear meu projeto.
Steve

3
Como você descobriu que Global.asax se referia a uma DLL antiga?
xaisoft

@xiasoft: A DLL antiga continha rotas que eu excluí, mas o Route Debugger mostrou que elas ainda estavam lá. Quando apaguei a DLL antiga, as rotas antigas também foram removidas.
Rn222

4

As rotas são carregadas de todos os assemblies em AppDomain.CurrentDomain, portanto, se seus assemblies antigos ainda fazem parte disso, você ainda pode obter rotas antigas / duplicadas.


3
Como posso verificar se esse é o problema?
Rn 222

Está certo. Aconteceu no meu projeto. Quando mudei seu nome, ocorreu esse erro. Depois de remover o conjunto antigo, o erro desapareceu.
bafsar

3

No meu caso, me deparei com esse problema, quando adicionei referência a outro projeto da solução, que também era MVC e utilizo os mesmos nomes na área (não queria adicionar esse projeto, não sei como aconteceu ) Quando removi essa DLL, o projeto começou a funcionar.


Nem me ocorreu que isso pudesse acontecer, já que sempre mantive meus projetos de sites autocontidos em vez de dividir as coisas em uma dúzia de peças "por causa da arquitetura". Nova equipe, novas convenções, novas chances de internalizar algumas das opções que ainda não achei úteis.
brichins

2

Excluir as DLLs sozinha não funcionou para mim (no VS2013), mas excluir as pastas 'bin' e 'obj' inteiras e, em seguida, construir a solução funcionou perfeitamente! Me faz desejar não ter passado tanto tempo tentando consertar ...


1

Nenhuma das sugestões funcionou para mim. Fui em frente e reiniciei o servidor web (IIS neste caso) e isso eliminou o erro depois que eu consertei o código. A DLL deve ter sido armazenada em cache no IIS.


1

tente este código, apenas mude o nome

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

Estou recebendo o mesmo erro. Mas finalmente encontrei a solução. Cenário: Estou adicionando uma dll (aplicativo mvc4) diferente em meu aplicativo mvc4 da API da web. Ao tentar correr. Estou recebendo o mesmo erro. Causa raiz- Quando meu aplicativo de API da web é executado .Application, registre toda a área de si mesmo e comece a carregar as referências de dll do domínio do aplicativo atual. Quando o aplicativo carrega dll (aplicativo MVC4) naquele momento, obtendo erro porque o maproute atual já adiciona a chave para "HelpPage_Default".

Solução. 1.Altere a chave para RegisterArea no maproute ou aplicativo atual ou aplicativo existente (consulte dll). 2. Mova o código dll do código (aplicativo mvc4) para outro liberary e consulte o novo dll.


0

Eu estava ligando manualmente AttributeRoutingHttpConfig.Start()no meu Global.asax. Não notei esta linha gerada automaticamente na parte superior do arquivo que o chama automaticamente.

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

0

Eu tinha um aplicativo que era um aplicativo Forms migrado para MVC com um componente de terceiros usado para autenticação que redirecionava para outro site. O componente iniciaria uma sessão duas vezes se o usuário ainda não estivesse conectado (uma para a conexão inicial ao site e outra para o retorno). Resolvi isso com o seguinte código:

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

Excluir as dlls na pasta bin funcionou 100%, eu ainda tinha dlls que meu projeto precisava para reconstruir. Em vez disso, faça uma cópia da pasta bin. em seguida, exclua o original. reconstrua o projeto. se falhar, coloque as dlls ausentes na pasta bin.


0

Eu estava executando um site MVC2 antigo e tive esse problema porque o 'Modo de pipeline gerenciado' do IIS estava definido como 'Integrado' por padrão (pressione F4 no projeto). Mudar para 'Clássico' corrigiu o problema


0

Ao publicar em um Serviço de Aplicativo do Azure, tive que verificar as "Configurações" -> "Opções de Publicação de Arquivo" -> "Remover arquivos adicionais no destino" da caixa de diálogo Publicar para obter a DLL do projeto antigo e os arquivos de símbolo removidos. Então o site carregaria.

Esta é essencialmente a solução de respostas atuais (Fleas) no núcleo. Exclua a DLL incorreta.

O que fez com que esse DLL antigo fosse retido foi que eu estava carregando uma versão mais antiga do site (modelos MVC 3 ~ 5, mas projeto da web diferente com namespaces em conflito, já que a versão mais recente era uma cópia desse projeto feita em algum ponto no passado recente. ) As DLLs do projeto mais recente precisavam apenas ser excluídas. Existem várias maneiras de fazer isso. Eu descobri que usar um diálogo é o atm mais fácil. O login no sistema de arquivos e a transferência dos arquivos manualmente também funcionam.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.