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

Не было найдено ни одного типа, который бы соответствовал контроллеру с именем "Пользователь",

Я пытаюсь перейти на страницу, 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();
    }
}

Скажите, пожалуйста, что я делаю неправильно?

4b9b3361

Ответ 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.

Ответ 14

В моем случае это было чрезмерно агрессивное кэширование с помощью WebHostHttpControllerTypeResolver.

Fix:

  1. Удалите все файлы (или в моем случае просто любые файлы с именем "MS-ApiControllerTypeCache.xml") по этому пути:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root

  2. Перезапустите пул приложений

кредит: https://sitecore.stackexchange.com/info/9897/webapi-controllers-not-being-found-in-sitecore-8-2