Ответ 1
У меня была аналогичная проблема, и это связано с ошибкой копирования в моей части, где я добавил копию этой строки в файле WebApiConfig.cs:
config.MapHttpAttributeRoutes();
убедитесь, что у вас есть только один из них.
Я недавно добавил Microsoft.AspNet.WebApi.WebHost
в проект MVC WebAPI, который позволил бы мне использовать атрибут [Route("api/some-action")]
в моем действии. Я решил некоторые ошибки, используя эту статью, но не могу решить третью ошибку ниже. Добавленные исправленные ошибки ниже, чтобы получить обратную связь, если я сделал что-то не так.
Первая ошибка: на контроллере 'X' не найдено ни одного действия, соответствующего имени 'some-action'
Решение: добавлен config.MapHttpAttributeRoutes();
в метод Register
WebApiConfig.cs.
Вторая ошибка: System.InvalidOperationException Объект еще не был инициализирован. Убедитесь, что HttpConfiguration.EnsureInitialized() вызывается в коде запуска приложения после всех других кодов инициализации.
Решение: добавлен GlobalConfiguration.Configure(WebApiConfig.Register);
в Global.asax.cs Application_Start
Третья ошибка: System.ArgumentException: маршрут с именем "MS_attributerouteWebApi" уже находится в коллекции маршрутов. Имена маршрутов должны быть уникальными.
Решение =?
Я уже пытался очистить и удалить все библиотеки DLL из папки bin в соответствии с этим постом.
У меня была аналогичная проблема, и это связано с ошибкой копирования в моей части, где я добавил копию этой строки в файле WebApiConfig.cs:
config.MapHttpAttributeRoutes();
убедитесь, что у вас есть только один из них.
В Global.asax проверьте, сколько раз вызывается функция WebApiConfig.Register
.
Решено! Удалена строка WebApiConfig.Register(GlobalConfiguration.Configuration);
из Global.asax.cs Application_Start
.
Я решил очистить каталог развертывания, прежде чем копировать новые файлы. Вероятно, был старый файл, который пытается зарегистрировать один и тот же корень несколько раз.
Чтобы кто-то наткнулся на это, как и я, эта ошибка произойдет, если вы переименуете имя Ассамблеи (свойства проекта). В моем случае я переименовал проект и перешел в свойства, чтобы изменить имя сборки (что VS2013 не сделает для вас).
Поскольку имя сборки отличается, Clean или Rebuild не удаляют "старую" сборку, если она находится в папке \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"));
Связано или нет напрямую, надеясь, что этот фрагмент поможет!
Я испытывал ту же проблему. Решение, которое я нашел, состояло в том, что мне нужна визуальная базовая поддержка моно. Когда я выполнил "yum install mono-basic" и перезагрузил компьютер, ошибка исчезла.
В моем случае ошибка была: "Маршрут с именем" 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();
линия сверху метода, и это было решено.
У меня была та же проблема, и я обнаружил, что в 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 }
);
}
}