一条名为';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。
我也遇到了类似的问题,这与我在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();
从上面的方法得到的线,并得到了解决。