「x」という名前のルートはすでにルートコレクションにあります。ルート名は一意である必要があります。ASP.NET MVC 3の例外


98

ASP.NET MVC 3 Webサービスを実行していますが、この例外が断続的に発生します。

スタックトレース:

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

    }
}

ルートを定義した別の場所はありますか?エリア?
Shyju

スタックトレースを追加し、ルートに関する追加情報を追加しました。
Rn222 2012年

回答:


297

この問題を修正するには、プロジェクトのbinフォルダーに移動し、すべてのDLLファイルを削除してから再ビルドする必要があり、これにより問題が修正されました。


11
溶液を洗浄するだけで同じことができます。
Fabio Milheiro、2012

84
@Bomboca-クリーニングでは、プロジェクトに含まれていないDLLは削除されません。たとえば、プロジェクトのアセンブリ名を変更した場合、古いアセンブリはbinフォルダに残ります。
Josh M.

2
私は同じ問題を経験していました、そしてこれは私の問題をすぐに解決しました。ありがとうございました!
アルアンハダード2014

1
プロジェクトの名前を変更しましたが、古いDLLはまだbinフォルダーにありました。人々にお願いします:恒久的な解決策、公開するときは、最初にターゲットディレクトリのすべてのファイルを削除してください (ディレクトリに公開するときのオプション)
StijnSpijker '30 / 09/30

2
理由はわかりませんが、「クリーンソリューション」ではうまくいきません。あなたのソリューションは機能します。
user2980426 2016年

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

このメソッドでは、次の行が2回発生します。

RouteConfig.RegisterRoutes(RouteTable.Routes);

これにより、ルートがルートリストに2回追加され、同時にエラーが発生することが保証されました。

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()の呼び出しも重複しています。
Spivonious 2015

また、私はこれに遭遇しました:WebApiConfig.Register(GlobalConfiguration.Configuration); GlobalConfiguration.Configure(WebApiConfig.Register); どちらもWebApiConfig.csで同じメソッドを呼び出します。トリックはもちろん、ルート名が設定されているところで休憩を取り、コールスタックを確認することです。
リード

このエラーが発生し、他の解決策はどれも機能しませんでしたが、重複するAreaRegistration.RegisterAllAreas();が見つかりました。global.asaxファイルの行。それらの1つを削除すると、エラーが削除されました。
ewomack

10

Global.asaxが名前を変更する前に、サイトのDLLファイルの古いバージョンを参照していることがわかりました。ビルド>クリーンアップを行ったときに、VSプロジェクト/ソリューションがDLLを参照しなくなったため、DLLはクリーンアップされていませんでした。DLLの新しいバージョンのみが使用されてサイトが正しく機能しているように見えることもありますが、最終的には両方がロードされてルートの競合が発生するようです。


プロジェクト名を変更した後、binとobjを削除するとうまくいきました。
スティーブ

3
Global.asaxが古いDLLを参照していることをどのようにして知りましたか?
xaisoft 2015年

@xiasoft:古いDLLには私が削除したルートが含まれていましたが、ルートデバッガーはそれらがまだそこにあることを示しました。古いDLLを削除すると、古いルートも削除されました。
Rn222 2016

4

ルートはAppDomain.CurrentDomain内のすべてのアセンブリから読み込まれるため、古いアセンブリがまだその一部である場合は、古いルートまたは重複したルートを取得している可能性があります。


3
これが問題かどうかを確認するにはどうすればよいですか?
Rn222 2012年

そのとおり。それは私のプロジェクトで起こりました。名前を変えたところ、このエラーが発生しました。古いアセンブリを削除すると、エラーが発生しなくなりました。
bafsar 2017

3

私の場合、この問題に直面しました。ソリューションから別のプロジェクトへの参照を追加しましたが、これもMVCであり、エリアで同じ名前を使用しています(このプロジェクトを追加したくなかったので、どうして起こったのかわかりません) )。このDLLを削除すると、プロジェクトが機能し始めました。


私は自分のサイトプロジェクトを「アーキテクチャのため」に数十の部分に分割するのではなく、常に自己完結型にしているので、これが起こる可能性があるとは思いもしませんでした。新しいチーム、新しい慣習、私がまだ役に立たなかったいくつかのオプションを内部化する新しいチャンス。
ブリチン

2

DLLを削除するだけではうまくいかなかった(VS2013では)が、「bin」フォルダーと「obj」フォルダー全体を削除してからソリューションをビルドすると、完璧に機能しました。私はそれを修正するために長い間費やしていなかったと思います...


1

提案はどれもうまくいきませんでした。先に進み、Webサーバー(この場合は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

同じエラーが発生します。しかし、最終的に私は解決策を得ました。シナリオ:Web API MVC4アプリケーションに別の(MVC4アプリケーション)DLLを追加しています。実行しようとすると。同じエラーが発生します。根本的な原因-Web APIアプリケーションを実行すると、.Applicationが自己からすべての領域を登録し、現在のアプリケーションドメインのDLL参照へのロードを開始します。アプリケーションがDLL(MVC4アプリケーション)をロードすると、現在のmaprouteがすでに「HelpPage_Default」のキーを追加しているため、エラーが発生します。

解決。1.現在のアプリケーションまたは既存のアプリケーション(dllを参照)のいずれかでmaprouteのRegisterAreaのキーを変更します。2.コードdll(mvc4アプリケーション)コードを別のライブラリに移動し、新しいdllを参照します。


0

AttributeRoutingHttpConfig.Start()Global.asaxを手動で呼び出していました。自動的に呼び出されるファイルの上部にあるこの自動生成された行に気づかなかった。

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

0

別のサイトにリダイレクトされる認証に使用されるサードパーティコンポーネントを使用してMVCに移行されたフォームアプリであるアプリケーションがありました。ユーザーがまだログインしていない場合、コンポーネントはセッションを2回開始します(サイトへの最初の接続で1回、戻りで1回)。だから私はこれを次のコードで解決しました:

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

binフォルダー内のdllを削除しても100%機能しましたが、プロジェクトを再構築するために必要なdllがまだありました。むしろ、binフォルダーのコピーを作成します。次に、original.rebuildプロジェクトを削除します。失敗した場合は、不足しているdllをbinフォルダーに配置します。


0

古いMVC2 Webサイトを実行していて、IISの「マネージパイプラインモード」がデフォルトで「統合」に設定されていたため、この問題が発生しました(プロジェクトでF4を押します)。「クラシック」に変更すると問題が修正されました


0

Azure App Serviceに公開するとき、古いプロジェクトDLLとシンボルファイルを削除するために、公開ダイアログの[設定]-> [ファイル公開オプション]-> [宛先で追加ファイルを削除]を確認する必要がありました。次に、サイトが読み込まれます。

これは基本的に、コアにおける現在の回答(Fleasの)ソリューションです。問題のDLLを削除します。

この古いDLLが保持される原因は、古いバージョンのWebサイト(MVC 3〜5テンプレートですが、名前空間が競合する別のWebプロジェクトをロードしていたためです。新しいバージョンはこのプロジェクトのコピーであり、最近のある時点で作成されたためです。 )新しいプロジェクトのDLLを削除する必要があるだけです。これを実現するには、さまざまな方法があります。ダイアログを使用するのが最も簡単なATMであることがわかりました。ファイルシステムにログインし、手動でファイルを軸処理することも確かに機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.