名为' MS_attributerouteWebApi'已经在路线集合中

时间:2014-10-15 19:22:16

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

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

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

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

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

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

10 个答案:

答案 0 :(得分:32)

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

  

config.MapHttpAttributeRoutes();

确保您只有其中一种。

答案 1 :(得分:11)

In the Global.asax, check how many times public static class TbHelper { // Method for use public static void SelectAllTextOnEnter(TextBox Tb) { Tb.Enter += new EventHandler(Tb_Enter); Tb.Click += new EventHandler(Tb_Click); } private static TextBox LastTb; private static void Tb_Enter(object sender, EventArgs e) { var Tb = (TextBox)sender; Tb.SelectAll(); LastTb = Tb; } private static void Tb_Click(object sender, EventArgs e) { var Tb = (TextBox)sender; if (LastTb == Tb) { Tb.SelectAll(); LastTb = null; } } } function has been called.

答案 2 :(得分:6)

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

答案 3 :(得分:5)

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

答案 4 :(得分:2)

对于任何像我这样绊倒的人,如果重命名程序集名称(项目属性),将发生此错误。在我的情况下,我重命名了一个项目,然后进入属性来更改程序集名称(VS2013不会为你做什么)。

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

答案 5 :(得分:1)

你可能有不止一个注册。

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

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

并写下这些而不是它们:

  

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

我不确定理由;但在同样的情况下,它对我有用。

答案 6 :(得分:0)

我也遇到了类似的问题(特别是MS_attributerouteWebApi路线,但是路线不同)。验证只存在一个config.MapHttpAttributeRoutes()后,开始意识到MapHttpAttributeRoutes将注册所有项目程序集,包括外部引用的程序集。在发现我有一个参考组件正在注册自己的路线后,我找到了一种排除方式或者#34;跳过"覆盖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"));

是否直接相关,希望这个片段可以提供帮助!

答案 7 :(得分:0)

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

答案 8 :(得分: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(); 上面的方法中的行,并得到解决。

答案 9 :(得分:0)

我遇到了同样的问题,我在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 }
        );


    }
}