Было найдено несколько типов, которые соответствуют контроллеру с именем "Главная",

В настоящее время у меня есть два несвязанных проекта MVC3, размещенных в Интернете.

Один работает отлично, другой не работает, давая мне ошибку:

Было найдено несколько типов, которые соответствуют контроллеру с именем "Главная". Эта может произойти, если маршрут, обслуживающий этот запрос ('{controller}/{action}/{id}') не определяет пространства имен для поиска для контроллера, который соответствует запросу.

Если это так, зарегистрируйте этот маршрут, вызвав перегрузку метода "MapRoute" который принимает параметр "namespaces".

Как работает мой хост, он дает мне FTP-доступ, и в этой папке у меня есть еще две папки, по одному для каждого из моих приложений.

ftpFolderA2/foo.com

ftpFolderA2/bar.com

foo.com отлично работает, я публикую свое приложение в своей локальной файловой системе, а затем FTP-содержимое, и оно работает.

Когда я загружаю и пытаюсь запустить bar.com, проблема выше срабатывает и мешает мне использовать мой сайт. Все, пока foo.com все еще работает.

Является ли bar.com поиском от контроллеров внутри везде ftpFolderA2 и почему он находит еще один HomeController? Как я могу сказать, что он только выглядит в папке Controller так, как должен?

Факты:

  • Не использовать области. Это два ПОЛНОСТЬЮ несвязанные проекты. Я помещаю каждый опубликованный проект в каждую соответствующую папку. Ничего необычного.
  • В каждом проекте есть только 1 HomeController.

Может кто-нибудь подтвердить, что это проблема?

Ответ 1

Это сообщение об ошибке часто возникает, когда вы используете области, и у вас есть то же имя контроллера внутри области и корня. Например, у вас есть два:

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs

Чтобы решить эту проблему (как подсказывает вам сообщение об ошибке), вы можете использовать пространства имен при объявлении своих маршрутов. Поэтому в определении основного маршрута в Global.asax:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Controllers" }
);

и в вашем ~/Areas/Admin/AdminAreaRegistration.cs:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

Если вы не используете области, кажется, что ваши оба приложения размещены внутри одного и того же приложения ASP.NET, и конфликты возникают из-за того, что у вас одни и те же контроллеры, определенные в разных пространствах имен. Вам придется настроить IIS для размещения этих двух в качестве отдельных приложений ASP.NET, если вы хотите избежать подобных конфликтов. Спросите своего хостинг-провайдера, если у вас нет доступа к серверу.

Ответ 2

Вот еще один сценарий, в котором вы можете столкнуться с этой ошибкой. Если вы переименуете свой проект так, чтобы имя файла сборки изменилось, возможно, у вас есть две версии вашей сборки ASP.NET, которые будут воспроизводить эту ошибку.

Решение состоит в том, чтобы перейти в вашу папку bin и удалить старые DLL. (Я попробовал "Rebuild Project", но это не удаляло их, поэтому обязательно проверяйте bin, чтобы убедиться, что они ушли)

Ответ 3

В MVC4 и MVC5 Он немного отличается, используйте следующие

/App_Start/RouteConfig.cs

namespace MyNamespace
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces:  new[] {"MyNamespace.Controllers"}
            );
        }
    }
}

и в областях

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );

Ответ 5

То, что говорят другие, верно, но для тех, кто по-прежнему сталкивается с одной и той же проблемой:
В моем случае это произошло из-за того, что я скопировал другой проект n, переименовал его в нечто другое НО предыдущие выходные файлы в папке bin все еще были там... И, к сожалению, нажав Build -> Clean Solution после переименования проекта и его Namespaces не удаляет их... поэтому удаление их вручную решило мою проблему!

Ответ 6

Проверьте папку bin, если есть другой файл dll, который может конфликтовать с классом homeController.

Ответ 7

в папке bin/ проекта

убедитесь, что у вас есть только PROJECT_PACKAGENAME.DLL

и удалите ANOTHER_PROJECT_PACKAGENAME.DLL

который может появиться здесь по ошибке или просто переименуйте свой проект

Ответ 8

Другим решением является регистрация пространства имен по умолчанию с помощью ControllerBuilder. Поскольку у нас было много маршрутов в нашем основном приложении и только один общий маршрут в наших областях (где мы уже указывали пространство имен), мы обнаружили, что это самое простое решение:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");

Ответ 9

Даже если вы не используете области, вы все равно можете указать в своем RouteMap, какое пространство имен использовать

routes.MapRoute(
    "Default",
    "{controller}/{action}",
    new { controller = "Home", action = "Index" },
    new[] { "NameSpace.OfYour.Controllers" }
);

Но похоже, что актуальная проблема заключается в том, как ваши два приложения настроены в IIS

Ответ 10

У меня была эта проблема, но только когда я опубликовал ее на своем веб-сайте, мой локальный отладчик прошел нормально. Я обнаружил, что мне нужно использовать FTP с моего веб-хостинга и зайти в мой каталог публикации и удалить файлы в папке BIN, удалив их локально ничего не делал, когда я публиковал.

Ответ 11

Вы также можете получить ошибку 500, если вы добавите собственную сборку, содержащую ApiController, переопределив GetAssemblies из DefaultAssembliesResolver и уже находится в массиве из base.GetAssemblies()

Пример:

public class MyAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        var baseAssemblies = base.GetAssemblies();

        var assemblies = new List<Assembly>(baseAssemblies);

        assemblies.Add(Assembly.GetAssembly(typeof(MyAssembliesResolver)));

        return new List<Assembly>(assemblies);
    }
}

если вышеуказанный код находится в той же сборке, что и ваш контроллер, эта сборка будет в списке дважды и будет генерировать ошибку 500, так как веб-API не знает, какой из них использовать.

Ответ 12

Может быть другой случай с Областями, даже если вы выполнили все шаги в маршрутизации в областях (например, задание пространств имен в глобальной таблице маршрутизации):

Возможно, вы не обернули свой глобальный контроллер в 'namespace' вы предоставили в маршрутизации.

Например:

Сделано это:

public class HomeController : Controller
{

Вместо

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

Ответ 13

если вы хотите разрешить его автоматически. Вы можете использовать приложение assambly просто добавьте следующий код:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { string.Format("{0}.Controllers", BuildManager.GetGlobalAsaxType().BaseType.Assembly.GetName().Name) }
        );

Ответ 14

Получилась такая же проблема, и ничего не помогло. Проблема в том, что у меня фактически нет дубликатов, эта ошибка появляется после переключения пространства имен проектов от MyCuteProject до MyCuteProject.Web.

В конце я понял, что источником ошибки является файл global.asax - разметка XML, а не .cs -codebehind. Проверьте пространство имен в нем - это помогло мне.

Ответ 15

я просто удалил папку "Bin" с сервера и скопировал мой bin на сервер, и моя проблема решена.

Ответ 16

Другая вариация этой ошибки заключается в том, что вы используете resharper, и вы используете некоторые "авто" параметры рефакторинга, которые включают изменение имени пространства имен. Это то, что происходит со мной. Чтобы решить проблему с подобным сценарием, удалите папку bin

Ответ 17

В Route.config

namespaces: new [] { "Appname.Controllers" }

Ответ 18

Щелкните правой кнопкой мыши проект и выберите очистить проект. Или полностью полностью очистите каталог bin, а затем снова заново постройте. Это должно устранять любые оставшиеся сборки из предыдущих построек

Ответ 19

Некоторое время в одном приложении эта проблема также появляется. В этом случае установите эти флажки при публикации своего приложения. введите описание изображения здесь

Ответ 20

Если это может помочь другим, я также столкнулся с этой ошибкой. Проблема была вызвана неправильной ссылкой на моем веб-сайте. По неизвестной причине мой веб-сайт ссылался на другой веб-сайт в том же решении. И как только я удаляю эту плохую ссылку, предмет начал нормально работать.

Ответ 21

Мы обнаружили, что мы получили эту ошибку, когда в нашей сборке произошел конфликт, который появился как предупреждение.

Мы не получили подробностей до тех пор, пока мы не увеличили Visual Studio → Инструменты → Параметры → Проекты и решения → Сборка и запуск → Расширение вывода сборки проекта MSBuild до подробного.

Наш проект представляет собой веб-приложение .net v4, и возник конфликт между System.Net.Http(v2.0.0.0) и System.Net.Http(v4.0.0.0). Наш проект ссылался на версию файла v2 из пакета (включенного с использованием nuget). Когда мы удалили ссылку и добавили ссылку на версию v4, тогда сработала работа (без предупреждений) и ошибка была исправлена.

Ответ 22

Если вы работаете в Episerver или другой CMS на основе MVC, вы можете обнаружить, что это конкретное имя контроллера уже заявлено.

Это случилось со мной при попытке создать контроллер под названием FileUpload.

Ответ 23

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

У меня это будет полезно для вас.

Project Solution

Ответ 24

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

Ответ 25

Я обнаружил, что эта ошибка может возникнуть на традиционном веб-сайте ASP.NET при создании контроллера в каталоге, отличном от App_Code (иногда Visual Studio предотвращает это).

Он устанавливает тип файла "Компилировать", тогда как любой код, добавленный к "App_Code", устанавливается в "Содержимое". Если вы копируете или перемещаете файл в App_Code, тогда он все еще установлен как "Компилировать".

Я подозреваю, что это как-то связано с работой проекта веб-сайта, так как у проектов веб-сайта нет операции сборки. Очистка папки bin и изменение ее на "Content", кажется, исправят это.

Ответ 26

Это также может произойти, если у вас есть другая DLL в папке bin вашего приложения, и у этой DLL есть контроллер с именем Home, но в пространстве имен, отличном от вашего HomeController.

Например, если вы изменили имя своего проекта и по-прежнему имеете двоичные файлы, скомпилированные из старого проекта, то даже при очистке решения с помощью команды меню " Очистить решение" старые двоичные файлы останутся.

Если какой-либо из старых двоичных файлов имеет одно и то же имя контроллера (как и в случае простого изменения имени сборки проекта и нескольких пространств имен), у вас может возникнуть эта проблема.

Убедитесь, что вы удалили все остальные сборки из папки bin, которая, как вы знаете, вам не нужна.

Вот видео-демонстрация: https://youtu.be/8Snz2ySTAU8