Je fais un service Web ASP.NET MVC 3 et je continue à recevoir cette exception par intermittence.
Trace de la pile:
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
C'est probablement lié au fait que Route Debugger montre que j'ai d'anciennes routes que j'ai modifiées ou supprimées et qui ne disparaîtront pas (même après le redémarrage de ma machine). La trace de pile fait également référence à un fichier source qui a depuis longtemps été supprimé et mon application a été déplacée vers un nouvel emplacement, nettoyée et reconstruite depuis. Qu'est-ce que je rate?
Voici tout mon code d'enregistrement d'itinéraire:
// 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 }
);
}
}
Réponses:
Pour résoudre ce problème, je devais aller dans le dossier bin de mon projet, supprimer tous les fichiers DLL puis reconstruire et cela a résolu le problème.
la source
bin
dossier.Cette erreur peut survenir en raison de plusieurs causes, j'ai eu la même erreur et je l'ai résolue en modifiant la classe Global.asax.
La méthode Application_Start sur Global.asax.cs était comme:
La ligne suivante apparaît deux fois dans cette méthode:
Cela garantissait que l'itinéraire était ajouté deux fois à la liste des itinéraires et en même temps provoquait l'erreur.
J'ai changé la méthode Application_Start comme suit et l'erreur a disparu:
Ce n'est peut-être pas la solution à votre problème, mais cela peut peut-être aider d'autres personnes à l'avenir. Je n'ai pas vu cette réponse entre les autres, j'ai donc décidé d'ajouter ceci.
la source
J'ai découvert que Global.asax faisait référence à une ancienne version du fichier DLL du site avant de le renommer. La DLL n'était pas nettoyée lorsque j'ai fait Build> Clean up car le projet / solution VS n'y faisait plus référence. Il semble que parfois seule la version la plus récente de la DLL était utilisée, permettant au site de fonctionner correctement, mais finalement les deux seraient chargés, provoquant des conflits de route.
la source
Les routes sont chargées à partir de tous les assemblys dans AppDomain.CurrentDomain, donc si vos anciens assemblys en font toujours partie, vous pouvez toujours obtenir des routes anciennes / dupliquées.
la source
Dans mon cas, j'ai été confronté à ce problème, lorsque j'ai ajouté une référence à un autre projet de la solution, qui était également MVC et que j'utilise les mêmes noms dans la zone (je ne voulais pas ajouter ce projet, je ne sais pas comment cela s'est passé ). Lorsque j'ai supprimé cette DLL, le projet a commencé à fonctionner.
la source
La suppression des DLL seules ne fonctionnait pas pour moi (dans VS2013), mais la suppression de l'ensemble des dossiers «bin» et «obj», puis la création de la solution fonctionnait parfaitement! Ça me fait regretter de ne pas avoir passé si longtemps à essayer de le réparer ...
la source
Aucune des suggestions n'a fonctionné pour moi. Nous sommes allés de l'avant et avons redémarré le serveur Web (IIS dans ce cas) et cela a effacé l'erreur après avoir corrigé le code. La DLL doit avoir été mise en cache dans IIS.
la source
essayez ce code, changez seulement le nom
la source
J'obtiens la même erreur. Mais finalement j'ai une solution. Scénario: j'ajoute une DLL différente (application mvc4) dans mon application mvc4 de l'API Web. Quand essayez de courir. J'obtiens la même erreur. Cause racine - Lorsque mon application Web api s'exécute .Application enregistre toute la zone de soi et commence le chargement des références de dll du domaine d'application actuel. Lorsque l'application charge dll (application MVC4) cette fois-ci, une erreur se produit car maproute actuelle ajoute déjà la clé pour "HelpPage_Default".
Solution. 1.Changez la clé pour RegisterArea dans maproute soit l'application actuelle, soit l'application existante (reportez-vous à la dll). 2.Déplacez le code dll (application mvc4) vers une bibliothèque différente et reportez-vous à la nouvelle dll.
la source
J'appelais manuellement
AttributeRoutingHttpConfig.Start()
mon Global.asax. N'a pas remarqué cette ligne auto-générée en haut du fichier qui l'appelle automatiquement.la source
J'avais une application qui était une application Forms migrée vers MVC avec un composant tiers utilisé pour l'authentification qui redirigeait vers un autre site. Le composant démarrerait une session deux fois si l'utilisateur n'était pas déjà connecté (une fois pour la connexion initiale au site et une fois pour le retour). J'ai donc résolu cela avec le code suivant:
la source
La suppression des dll dans le dossier bin fonctionnait à 100%, j'avais encore des dll que mon projet avait besoin de reconstruire. Faites plutôt une copie du dossier bin. puis supprimez l'original. reconstruisez le projet. en cas d'échec, placez les DLL manquantes dans le dossier bin.
la source
J'utilisais un ancien site Web MVC2 et j'ai eu ce problème parce que le 'Managed Pipeline Mode' d'IIS était défini sur 'Intégré' par défaut (appuyez sur F4 sur le projet). Le changer en «Classique» a résolu le problème
la source
Lors de la publication sur un Azure App Service, je devais vérifier les "Paramètres" de la boîte de dialogue de publication -> "Options de publication de fichiers" -> "Supprimer les fichiers supplémentaires à destination" pour supprimer l'ancienne DLL du projet et les fichiers de symboles. Ensuite, le site se chargerait.
Il s'agit essentiellement de la solution actuelle des réponses (Fleas). Supprimez la DLL incriminée.
Ce qui a provoqué la conservation de cette ancienne DLL, c'est que je chargeais une version plus ancienne du site Web (modèles MVC 3 ~ 5 mais un projet Web différent avec des espaces de noms en collision, car la version la plus récente était une copie de ce projet dans un passé récent. ) Les DLL du projet plus récent avaient juste besoin d'être supprimées. Il existe différentes manières d'y parvenir. J'ai trouvé que l'utilisation d'une boîte de dialogue était le guichet automatique le plus simple. La connexion au système de fichiers et la suppression manuelle des fichiers fonctionnent certainement aussi.
la source