При использовании стандартного метода MapRoute a может передать набор строк, представляющий пространства имен, в которых будет выполняться поиск моего контроллера. Это, похоже, исчезло из MapHttpRoute. Как определить пространства имен по умолчанию, используя новую маршрутизацию API?
Как установить пространство имен по умолчанию в MapHttpRoute?
Ответ 1
У нас была эта проблема с ядром Umbraco, поэтому мы создали собственный IHttpControllerSelector, исходный код которого можно найти здесь:
Вы также можете установить пакет WebAPIContrib
который содержит NamespaceHttpControllerSelector
.
Чтобы зарегистрировать это, вы можете сделать это при запуске приложения:
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector),
new NamespaceHttpControllerSelector(GlobalConfiguration.Configuration));
Реализация довольно проста и имеет дело только с маршрутами, у которых есть набор данных "Пространства имен", который вы должны установить вручную, так как MapHttpRoute не поддерживает это. Пример:
var r = routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
r.DataTokens["Namespaces"] = new string[] {"Foo"};
Реализация также кэширует только контроллеры, найденные с дублирующимися именами, так как базовая реализация по умолчанию удаляет дубликаты из своего кэша.
Ответ 2
Эта функция не существует в настоящее время.
Ответ 3
Хотя в данный момент эта функция не существует, вы можете сделать это, выполнив свой собственный IHttpControllerSelector.
Эта статья в блоге немного детализирует детали: Веб-интерфейс ASP.NET: использование пространств имен в веб-интерфейсах версий
Ответ 4
Этот пример объясняет, как использовать разные пространства имен.
Ответ 5
Вам не нужно устанавливать пространства имен по умолчанию с помощью Web API, он будет искать контроллеры во всех пространствах имен в ссылочных сборках (общедоступные типы с именем, заканчивающимся на "Контроллер", который реализует IHttpController).
Ответ 6
Перед вызовом MapHttpRoute Factory добавьте
System.Web.Mvc.ControllerBuilder.Current.DefaultNamespaces.Add("Namespace.Full.Controllers");