我最近将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。
答案 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 }
);
}
}