web-dev-qa-db-ja.com

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

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

これはおそらく、Route Debuggerが、変更または削除した古いルートがあり、(マシンを再起動した後でも)消えないことを示しているという事実に関連している可能性があります。スタックトレースは、削除されてからずっと長い間、私のアプリが新しい場所に移動され、それ以降にクリーニングおよび再構築されたソースファイルも参照します。私は何が欠けていますか?

これが私のルート登録コードのすべてです。

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

    }
}
92
Rn222

この問題を解決するには、プロジェクトのbinフォルダーに移動し、すべてのDLLファイルを削除してから再構築しなければなりませんでした。これにより問題が修正されました。

281
Flea

このエラーは複数の原因で発生する可能性があります。同じエラーが発生し、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);
}

これはあなたの問題に対する答えではないかもしれませんが、おそらく将来的に他の人を助けることができます。私は他の人との間にこの答えを見なかったので、これを追加することにしました。

17
Max

Global.asaxは、名前を変更する前に、サイトの古いバージョンのDLLファイルを参照していたことがわかりました。DLL VSプロジェクト/ソリューションがそれを参照しなくなったため、[ビルド]> [クリーンアップ]を実行しました。時々、DLL 、最終的には両方がロードされ、ルートの競合が発生します。

9
Rn222

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

4
Filip W

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

2
DreamEvil

提案はどれも役に立たなかった。先に進み、Webサーバー(この場合はIIS)を再起動し、コードを修正した後にエラーをクリアしました。 DLLはIISにキャッシュされている必要があります。

1
joel1618

DLLだけを削除することは(VS2013では)うまくいきませんでしたが、「bin」フォルダーと「obj」フォルダー全体を削除してからソリューションを構築することは完全に機能しました!それを修正しようとしてそれほど長く費やしていないことを望みます...

1
Lyall

古いMVC2 Webサイトを実行していて、IIS 'Managed Pipeline Mode'がデフォルトで 'Integrated'に設定されていたため、この問題が発生しました(プロジェクトでF4を押します)。 '問題を修正しました

0
Phate01

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

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

0

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

0
Terry Mosoma

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

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

このコードを試して、名前を変更するだけ

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
Mahadev Sharma

別のサイトにリダイレクトされる認証に使用されるサードパーティのコンポーネントを使用して、MVCに移行されたFormsアプリであるアプリケーションがありました。ユーザーがまだログインしていない場合、コンポーネントはセッションを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
done_merson