Не было найдено ни одного типа, который бы соответствовал контроллеру с именем "Пользователь",
Я пытаюсь перейти на страницу, URL которой находится в следующем формате:
локальный: ххххх/Пользователь/{ID}/VerifyEmail SecretKey = xxxxxxxxxxxxxxx
Я добавил новый маршрут в файл RouteConfig.cs
, и поэтому мой RouteConfig.cs
выглядит так:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "VerifyEmail",
url: "User/{id}/VerifyEmail",
defaults: new { controller = "User", action = "VerifyEmail" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index",
id = UrlParameter.Optional }
);
}
}
К сожалению, при попытке перейти к этому URL-адресу я получаю эту страницу:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:52684/User/f2acc4d0-2e03-4d72-99b6-9b9b85bd661a/VerifyEmail?secretKey=e9bf3924-681c-4afc-a8b0-3fd58eba93fe'.
</Message>
<MessageDetail>
No type was found that matches the controller named 'User'.
</MessageDetail>
</Error>
и вот мой UserController:
public class UserController : Controller
{
// GET /User/{id}/VerifyEmail
[HttpGet]
public ActionResult VerifyEmail(string id, string secretKey)
{
try
{
User user = UsersBL.Instance.Verify(id, secretKey);
//logger.Debug(String.Format("User %s just signed-in in by email.",
user.DebugDescription()));
}
catch (Exception e)
{
throw new Exception("Failed", e);
}
return View();
}
}
Скажите, пожалуйста, что я делаю неправильно?
Ответы
Ответ 1
В моем случае, потратив почти 30 минут на исправление проблемы, я обнаружил причину этого:
Мой маршрут, определенный в WebApiConfig.cs
, был следующим:
config.Routes.MapHttpRoute(
name: "ControllersApi",
routeTemplate: "{controller}/{action}"
);
и он должен выглядеть следующим образом:
config.Routes.MapHttpRoute(
name: "ControllersApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
как вы видите, это мешало стандартным маршрутам, определенным в RouteConfig.cs
.
Ответ 2
В моем случае контроллер был определен как:
public class DocumentAPI : ApiController
{
}
Изменение его на следующее сработало!
public class DocumentAPIController : ApiController
{
}
Имя класса должно заканчиваться на Controller !
Редактировать: как @Corey Alix предложил, пожалуйста, убедитесь, что контроллер имеет модификатор публичного доступа; непубличные контроллеры игнорируются обработчиком маршрута!
Ответ 3
Другим решением может быть установка разрешения класса контроллера для публики.
установите это:
class DocumentAPIController : ApiController
{
}
в
public class DocumentAPIController : ApiController
{
}
Ответ 4
В моем случае я использовал Web API, и у меня не было public
, определенного для моего класса контроллера.
Что нужно проверить для Web API:
- Класс контроллера объявляется как
public
- Класс контроллера реализует ApiController
: ApiController
- Имя класса контроллера должно заканчиваться на
Controller
- Убедитесь, что ваш URL имеет префикс
/api/
. например. 'Хост: порт/API/{контроллер}/{actionMethod}'
Ответ 5
В моем случае я хотел создать контроллер веб-API, но из-за невнимательности мой контроллер был унаследован от контроллера вместо ApiController.
Ответ 6
В моем случае маршрутизация была определена как:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{*catchall}",
defaults: new { controller = "WarehouseController" }
в то время как контроллер должен быть сброшен в config:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{*catchall}",
defaults: new { controller = "Warehouse" }
Ответ 7
В моем случае я видел это, потому что у меня было два контроллера с тем же именем:
Один для обработки заказов клиентов под названием CustomersController
, а другой для получения событий также называется CustomersController
Я пропустил дублирование, я переименовал события один в CustomerEventsController
, и он отлично работал
Ответ 8
Испытала эту аналогичную проблему. Мы имеем дело с несколькими API-интерфейсами, и мы попали в неправильный номер порта и получили эту ошибку. Взял нас навсегда, чтобы понять. Убедитесь, что порт api, на который вы нажимаете, является правильным портом.
Ответ 9
У меня также была та же проблема. Я много искал и обнаружил, что требуется разрешение на уровне класса. по умолчанию уровень разрешения класса является внутренним, поэтому я думал, что это не повлияет на выполнение программы. Но на самом деле это повлияло, вы должны дать разрешение своего класса публично, чтобы у вас не возникло никаких проблем.
И еще один. если это проект webapi, ваш файл webapirouteconfig перезапишет параметры файла routeeconfig.cs. Поэтому обновите файл webapi routeconfig, чтобы нормально работать.
Ответ 10
В моем решении у меня есть проект под названием "P420", а в другом проекте у меня был P420Controller.
Когда .NET сокращает имя контроллера, чтобы найти маршрут, конфликтует с другим проектом, используемым в качестве библиотеки.
Надеюсь, поможет.
Ответ 11
В моем решении, когда я добавил свой новый контроллер в проект, мастер спросил меня, хочу ли я указать расположение контроллера в папке App_Code. Мастер предупредил меня: если я не найду его в папке App_Code, тип контроллера не будет найден. Но я не прочитал все предупреждение, потому что я хотел найти файл в другом месте... так, почему это не сработало для меня.
После того, как я добавил новый контроллер и оставил его в App_Code по умолчанию, все заработало.
Ответ 12
Столкнулся с такой же проблемой. Здесь проверены все ответы, но моя проблема была в пространстве имен. Атрибуты маршрутизации существуют в System.Web.Mvc и System.Web.Http. Мое использование включало пространство имен Mvc, и это было причиной. Для webapi вам нужно использовать System.Net.Http.
Ответ 13
В моем случае я назвал APi как
Http://locahost: 56159/API/loginDataController/GetLoginData
пока должно быть как
Http://locahost: 56159/API/loginData/GetLoginData
удалил контроллер из URL и он начал работать...
Мир!
Ответ 14
В моем случае это было чрезмерно агрессивное кэширование с помощью WebHostHttpControllerTypeResolver.
Fix:
-
Удалите все файлы (или в моем случае просто любые файлы с именем "MS-ApiControllerTypeCache.xml") по этому пути:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root
-
Перезапустите пул приложений
кредит: https://sitecore.stackexchange.com/info/9897/webapi-controllers-not-being-found-in-sitecore-8-2