一条名为';MS_attributerouteWebApi';已在路由集合中

本文关键字:路由 集合 MS 一条 attributerouteWebApi | 更新日期: 2023-09-27 18:26:43

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

第一个错误:在控制器"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"的路由已在路由集合中。路由名称必须唯一。
解决方案=?

根据这篇文章,我已经尝试过从bin文件夹中清理和删除所有DLL。

一条名为';MS_attributerouteWebApi';已在路由集合中

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

config.MapHttpAttributeRoutes();

确保你只有一个。

Global.asax中,检查调用WebApiConfig.Register函数的次数。

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

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

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

    }
}

对于像我一样偶然发现这一点的人来说,如果重命名程序集名称(项目属性),就会发生此错误。在我的案例中,我重命名了一个项目,并进入属性来更改程序集名称(VS2013不会为您做这件事)。

由于程序集名称不同,如果"旧"程序集位于''bin文件夹中,则"清理"或"重建"不会删除该程序集。您必须从''bin文件夹中删除程序集,然后重新生成&跑

可能您有多个相同的寄存器。

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

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

并写下这些而不是它们:

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

我不知道为什么;但这对我来说是有效的。

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

无论是否直接相关,希望这个片段能有所帮助!

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

在我的案例中,错误是:"名为'MS_attributerouteWebApi'的路由已在路由集合中。路由名称必须唯一。参数名称:name"

代码为:

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();从上面的方法得到的线,并得到了解决。