«Маршрут с разрешенным виртуальным путем« ~ / blah »уже добавлен».в WCF WebAPI Preview 6 - PullRequest
1 голос
/ 22 марта 2012

Итак, я использую WCF WebAPI Preview 6 в своем приложении (Orchard CMS).Я пытаюсь зарегистрировать маршрут и постоянно получаю:

Маршрут с разрешенным виртуальным путем '~ / api / register' уже добавлен.Имя параметра: virtualPath

со следующим:

var webApiRoute = new WebApiRoute(routePrefix, serviceHostFactory, serviceType) { Constraints = new RouteValueDictionary(constraints) };

находится там, где оно ломается.Я могу сделать путь маршрута любым и продолжать получать ту же ошибку.

Мой полный метод выглядит следующим образом:

public class WebApiRoutes : IRouteProvider 
{
    private readonly IRegistrationWebApiConfiguration _registrationWebApiConfiguration;

    public WebApiRoutes(IRegistrationWebApiConfiguration registrationWebApiConfiguration) 
    {
        _registrationWebApiConfiguration = registrationWebApiConfiguration;
    }

    public IEnumerable<RouteDescriptor> GetRoutes() {
        return new[] {
                new RouteDescriptor { Priority = 1, Route = MapServiceRoute(typeof(RegistrationResource), "api/register1006", _registrationWebApiConfiguration.GetInstance())
            }
        };
    }

    public void GetRoutes(ICollection<RouteDescriptor> routes) {
        foreach (var routeDescriptor in GetRoutes())
            routes.Add(routeDescriptor);
    }

    private static ServiceRoute MapServiceRoute(Type serviceType, string routePrefix, HttpConfiguration configuration = null, object constraints = null, bool useMethodPrefixForHttpMethod = true)
    {
        if (configuration == null)
            configuration = new WebApiConfiguration(useMethodPrefixForHttpMethod);

        var serviceHostFactory = new HttpServiceHostFactory { Configuration = configuration };
        var webApiRoute = new WebApiRoute(routePrefix, serviceHostFactory, serviceType) { Constraints = new RouteValueDictionary(constraints) };
        return webApiRoute;
    }
}

ОБНОВЛЕНИЕ

Итак, основываясь на комментариях Петра ниже, я попробовал его вторую пулю.Первое не сработало.Второй дает то же исключение и вылетает на конструкции для моего класса:

public class MyRestRoute : WebApiRoute {
    public MyRestRoute(string routePrefix, ServiceHostFactoryBase serviceHostFactory, Type serviceType) : base(routePrefix, serviceHostFactory, serviceType) {}

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) {
        return null;
    }
}

1 Ответ

1 голос
/ 23 марта 2012

Это также случилось с WCF ServiceRoute некоторое время назад - вам может пригодиться эта ссылка: http://orchard.codeplex.com/discussions/256924.

Вы также можете попробовать:

  • Изменение RouteDescriptor.Priority на очень большое число (например, Int32.MaxValue).Это гарантирует, что ваш маршрут будет зарегистрирован до любого другого маршрута, поэтому он не будет конфликтовать с другими, «нормальными» маршрутами.
  • Если первый не поможет, попробуйте создать свой собственный подкласс WebApiRoute, переопределите метод GetVirtualPath и сделайте так, чтобы он всегда возвращал ноль.Это заставит платформу пропустить этот маршрут при генерации URL.
...