101

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

    }
}
4

16 に答える 16

304

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

于 2012-08-14T19:36:43.900 に答える
21

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

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

于 2014-06-12T08:37:12.723 に答える
11

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

于 2012-06-12T13:18:13.340 に答える
5

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

于 2012-06-11T20:57:45.517 に答える
3

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

于 2016-08-12T13:30:25.590 に答える
2

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

于 2015-10-01T08:32:56.527 に答える
0

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

[assembly: WebActivator.PreApplicationStartMethod(typeof(Mev.Events.Web.AttributeRoutingHttpConfig), "Start")]
于 2014-09-21T08:18:28.107 に答える
0

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

于 2015-11-26T06:05:19.917 に答える
0

別のサイトにリダイレクトされる認証に使用されるサードパーティのコンポーネントを使用して 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}
                    );
            }

于 2015-07-17T15:36:27.010 に答える