Получение "Не найден тип, который соответствует контроллеру с именем" SampleSlashBaseService "при попытке использования WebAPI
У меня есть проект webapi с базовым ApiController с именем SlashBaseService:
[RouteArea("uBase")]
public abstract class SlashBaseService : ApiController
{
}
Результирующая dll используется в проекте WebForms, поэтому у меня также есть класс WebActivator со следующим кодом для создания маршрутов:
RouteTable.Routes.MapHttpAttributeRoutes(config =>
{
// Get all services inheriting from SlashBaseService
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (var type in assembly.GetTypes())
{
if (type.IsSubclassOf(typeof(SlashBaseService)))
{
// Scan assembly
config.ScanAssembly(assembly);
// Skip the remaining types in this assembly
break;
}
}
}
});
RouteTable.Routes.MapHttpRoute(
name: "DefaultBase",
routeTemplate: "base/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
У меня также есть служба тестирования в отдельной сборке:
public class SampleSlashBaseService : SlashBaseService
{
[GET("TestOpenMethod")]
public string GetTestOpenMethod()
{
return "Hello anonymous!";
}
[GET("Echo/{message}")]
public string GetEcho(string message)
{
return message;
}
}
Все довольно простые вещи. Проблема в том, что когда я пытаюсь перейти к одному из URL-адресов, это создает следующее сообщение:
Не найден тип, который соответствует контроллеру с именем "SampleSlashBaseService".
Список маршрутов из /routes.axd также выглядит правильно.
Ответы
Ответ 1
Нашел проблему.
ApiControllers
имена классов должны быть помечены как "Контроллер", а мой - нет.
Изменение его на SampleSlashBaseController
решило проблему.
Примечание:
Можно суффикс его с помощью "Сервис", как и я, но тогда вы должны реализовать пользовательский IHttpControllerSelector
, как описано здесь: http://netmvc.blogspot.no/2012/06/aspnet-mvc-4-webapi-support-areas-in.html
Ответ 2
Вам также необходимо убедиться, что класс Controller Public
Ответ 3
В моем случае контроллер был правильно определен, но не был опубликован.
Ответ 4
В моем случае было два контроллера с тем же именем в разных папках. Переименование их решило проблему мгновенно.
Ответ 5
Для чего это стоит, я столкнулся с этим, и моя проблема заключалась в том, что мой добавленный вручную класс не наследовал от ApiController. Определение класса должно быть public class QueueController : ApiController
не public class QueueController
. Какая глупость игнорировать.