路由名称为“MS_attributerouteWebApi”的路由已经在路由集合中存在。

23

我最近在MVC WebAPI项目中添加了Microsoft.AspNet.WebApi.WebHost,这将允许我在操作上使用[Route("api/some-action")] 属性。我通过 这篇文章 解决了一些错误,但无法解决以下第三个错误。下面已经添加了解决错误以获取反馈。

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

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

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

我已经尝试按照 这篇帖子 的说明清理并删除了bin文件夹中的所有DLL。

10个回答

45

我曾经遇到过类似的问题,它与我在 WebApiConfig.cs 文件中复制粘贴时添加了该行代码有关:

config.MapHttpAttributeRoutes();

确保您只有一个这样的代码行。


3
或者像我一样,在 Global.asax.cs 文件中重复了 GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes())。 - Iman

18
Global.asax 文件中,检查 WebApiConfig.Register 函数已被调用的次数。

7

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


1
在项目重命名后,我的 bin 文件夹中出现了流氓 DLL。清理项目没有帮助,所以我不得不通过资源管理器手动删除这些 DLL。 - oscilatingcretin
我真的很讨厌这种解决方案,但在这种情况下,它有效。 - AFetter

7

问题已解决!从Global.asax.cs的Application_Start中移除了WebApiConfig.Register(GlobalConfiguration.Configuration);这行代码。


1
GlobalConfiguration.Configure(WebApiConfig.Register); 是我 global.asax 文件中的第一行代码,它似乎在做同样的事情。 - Jhonny D. Cano -Leftware-

3

我曾遇到同样的问题,后来发现在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 }
        );


    }
}

2

可能您注册了多个相同的内容。

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

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

请使用以下代码替换原有代码:

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

我不确定原因,但在我的同样情况下它起作用了。


2

对于像我一样偶然遇到这个问题的人来说,如果你重命名程序集名称(项目属性),就会出现此错误。在我的情况下,我正在重命名一个项目,并进入属性来更改程序集名称(VS2013不会为您执行此操作)。

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


0

我也遇到了类似的问题(不是特定的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"));

无论直接关联与否,希望这个代码片段能够帮到你!

0
在我的情况下,错误是:“路由集合中已经存在名为'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();这一行,问题得到了解决。

0

我曾经遇到过同样的问题。我找到的解决方案是需要安装 Mono 的 Visual Basic 支持。当我执行了 "yum install mono-basic" 并重新启动计算机后,错误消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接