Подтвердить что ты не робот

Маршрут с именем "MS_attributerouteWebApi" уже находится в коллекции маршрутов

Я недавно добавил 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 в соответствии с этим постом.

4b9b3361

Ответ 1

У меня была аналогичная проблема, и это связано с ошибкой копирования в моей части, где я добавил копию этой строки в файле WebApiConfig.cs:

config.MapHttpAttributeRoutes();

убедитесь, что у вас есть только один из них.

Ответ 2

В Global.asax проверьте, сколько раз вызывается функция WebApiConfig.Register.

Ответ 3

Решено! Удалена строка WebApiConfig.Register(GlobalConfiguration.Configuration); из Global.asax.cs Application_Start.

Ответ 4

Я решил очистить каталог развертывания, прежде чем копировать новые файлы. Вероятно, был старый файл, который пытается зарегистрировать один и тот же корень несколько раз.

Ответ 5

Чтобы кто-то наткнулся на это, как и я, эта ошибка произойдет, если вы переименуете имя Ассамблеи (свойства проекта). В моем случае я переименовал проект и перешел в свойства, чтобы изменить имя сборки (что VS2013 не сделает для вас).

Поскольку имя сборки отличается, Clean или Rebuild не удаляют "старую" сборку, если она находится в папке \bin. Вы должны удалить сборку из папки \bin, а затем перестроить и запустить.

Ответ 6

Вероятно, у вас один и тот же регистр более одного.

Попробуйте удалить ниже коды из Global.asax:

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

и напишите вместо них:

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

Я не уверен в причине; но он работал у меня в том же самом случае.

Ответ 7

У меня также возникла аналогичная проблема (а не маршрут 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"));

Связано или нет напрямую, надеясь, что этот фрагмент поможет!

Ответ 8

Я испытывал ту же проблему. Решение, которое я нашел, состояло в том, что мне нужна визуальная базовая поддержка моно. Когда я выполнил "yum install mono-basic" и перезагрузил компьютер, ошибка исчезла.

Ответ 9

В моем случае ошибка была: "Маршрут с именем" 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(); линия сверху метода, и это было решено.

Ответ 10

У меня была та же проблема, и я обнаружил, что в 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 }
        );


    }
}