【问题标题】:A route named 'MS_attributerouteWebApi' is already in the route collection名为“MS_attributerouteWebApi”的路由已在路由集合中
【发布时间】:2014-12-10 23:54:27
【问题描述】:

我最近将Microsoft.AspNet.WebApi.WebHost 添加到一个MVC WebAPI 项目中,这将允许我在我的操作中使用[Route("api/some-action")] 属性。我使用this article 解决了一些错误,但无法解决下面的第三个错误。如果我做错了什么,请在下面添加已解决的错误以获得反馈。

第一个错误:在控制器“X”上找不到与名称“some-action”匹配的操作
解决方案:将config.MapHttpAttributeRoutes(); 添加到WebApiConfig.cs Register 方法中。

第二个错误:System.InvalidOperationException 对象尚未初始化。确保在所有其他初始化代码之后在应用程序的启动代码中调用 HttpConfiguration.EnsureInitialized()。
解决方案:将 GlobalConfiguration.Configure(WebApiConfig.Register); 添加到 Global.asax.cs Application_Start

第三个错误:System.ArgumentException:名为“MS_attributerouteWebApi”的路由已在路由集合中。路由名称必须是唯一的。
解决方案 = ?

我已经尝试根据this post清理并删除bin文件夹中的所有DLL。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    我遇到了类似的问题,这与我的复制粘贴错误有关,我在 WebApiConfig.cs 文件中添加了这一行的副本:

    config.MapHttpAttributeRoutes();

    确保您只有其中之一。

    【讨论】:

    • 或像我一样在 Global.asax.cs 中使用 GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes())
    【解决方案2】:

    在 Global.asax 中,检查WebApiConfig.Register 函数被调用了多少次。

    【讨论】:

      【解决方案3】:

      解决了!从 Global.asax.cs Application_Start 中删除了行 WebApiConfig.Register(GlobalConfiguration.Configuration);。

      【讨论】:

      • GlobalConfiguration.Configure(WebApiConfig.Register);是我 global.asax 中的第一行,它似乎在做同样的事情。
      【解决方案4】:

      我已经通过在复制新文件之前清理部署目录来解决。可能有一些旧文件尝试多次注册同一个根。

      【讨论】:

      • 在项目重命名后,我的 bin 文件夹中有恶意 DLL。清理项目没有帮助,所以我不得不通过资源管理器手动删除 DLL
      • 我真的很讨厌这种解决方案,但在这种情况下。工作。
      【解决方案5】:

      我遇到了同样的问题,我在 WebApiConfig.cs 中发现了 在我为 API 版本添加配置之后

      我有这两行

      config.MapHttpAttributeRoutes(constraintResolver);
      
      config.MapHttpAttributeRoutes();
      

      我删除了第二行

      最终代码是

       public static class WebApiConfig
      {
          public static void Register(HttpConfiguration config)
          {
      
              // Web API routes
              var constraintResolver = new DefaultInlineConstraintResolver()
              {
                  ConstraintMap =
                  {
                      ["apiVersion"] = typeof( ApiVersionRouteConstraint )
                  }
              };
              config.MapHttpAttributeRoutes(constraintResolver);
              config.AddApiVersioning();
      
              // Web API configuration and services
      
              // Web API routes
             // config.MapHttpAttributeRoutes();
      
              config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );
      
      
          }
      }
      

      【讨论】:

        【解决方案6】:

        对于像我一样偶然发现此问题的任何人,如果您重命名程序集名称(项目属性),则会发生此错误。在我的情况下,我正在重命名一个项目,并进入属性以更改程序集名称(VS2013 不会为您做)。

        由于程序集名称不同,如果“旧”程序集位于 \bin 文件夹中,清理或重建将不会删除它。您必须从 \bin 文件夹中删除程序集,然后重新构建并运行。

        【讨论】:

          【解决方案7】:

          可能你有不止一个相同的寄存器。

          尝试从 Global.asax 中删除以下代码:

          GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
          

          用这个代替它们:

          GlobalConfiguration.Configuration.EnsureInitialized(); BundleConfig.RegisterBundles(BundleTable.Bundles);

          我不确定原因;但它在我同样的情况下对我有用。

          【讨论】:

            【解决方案8】:

            我也遇到了类似的问题(不是MS_attributerouteWebApi 路由,而是一个不同的命名路由)。在确认只存在一个config.MapHttpAttributeRoutes() 之后,开始意识到MapHttpAttributeRoutes 将注册所有项目程序集,包括外部引用的程序集。在发现我有一个正在注册自己的路由的引用程序集后,我找到了一种通过覆盖 DefaultDirectRouteProvider 来排除或“跳过”路由的方法:

            /// <summary>
            /// Allows for exclusion from attribute routing of controllers based on name
            /// </summary>
            public class ExcludeByControllerNameRouteProvider : DefaultDirectRouteProvider {
            
                private string _exclude;
                /// <summary>
                /// Pass in the string value that you want to exclude, matches on "ControllerType.FullName" and "ControllerType.BaseType.FullName"
                /// </summary>
                /// <param name="exclude"></param>
                public ExcludeByControllerNameRouteProvider(string exclude) {
                    _exclude = exclude;
                }
            
                protected override IReadOnlyList<RouteEntry> GetActionDirectRoutes(
                HttpActionDescriptor actionDescriptor,
                IReadOnlyList<IDirectRouteFactory> factories,
                IInlineConstraintResolver constraintResolver)
                {
                    var actionRoutes = new List<RouteEntry>();
                    var currentController = actionDescriptor.ControllerDescriptor.ControllerType;
                    if (!currentController.FullName.Contains(_exclude) && !currentController.BaseType.FullName.Contains(_exclude))
                    {
                        var result = base.GetActionDirectRoutes(actionDescriptor, factories, constraintResolver);
                        actionRoutes = new List<RouteEntry>(result);
                    }
                    return actionRoutes.AsReadOnly();
                }
            }
            

            这允许您传递控制器名称或基本类型名称以排除在您的WebApiConfig.cs 中,例如:

            config.MapHttpAttributeRoutes(new ExcludeByControllerNameRouteProvider("Controller.Name"));
            

            不管是否直接相关,希望这个sn-p能帮到你!

            【讨论】:

              【解决方案9】:

              我遇到了同样的问题。我找到的解决方案是我需要对单声道的 Visual Basic 支持。当我执行“yum install mono-basic”并重新启动计算机时,错误消失了。

              【讨论】:

                【解决方案10】:

                在我的情况下,错误是:“名为 'MS_attributerouteWebApi' 的路由已经在路由集合中。路由名称必须是唯一的。 参数名称:名称"

                代码是:

                public static void Register(HttpConfiguration config)
                        {
                            // Web API configuration and services
                
                            config.MapHttpAttributeRoutes();  // this line had issue
                
                            var constraintResolver = new DefaultInlineConstraintResolver();
                            constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));
                            config.MapHttpAttributeRoutes(constraintResolver);
                
                            config.Routes.MapHttpRoute(
                                name: "DefaultApi",
                                routeTemplate: "api/{controller}/{id}",
                                defaults: new { id = RouteParameter.Optional }
                            );
                        }
                

                解决方案: 我刚刚删除 - config.MapHttpAttributeRoutes(); 上述方法的行,它得到了解决。

                【讨论】:

                  猜你喜欢
                  • 2013-12-21
                  • 2015-03-27
                  • 2016-01-11
                  • 2016-05-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-14
                  • 2018-04-27
                  • 2017-12-01
                  相关资源
                  最近更新 更多