Было найдено несколько типов, которые соответствуют контроллеру с именем 'Home' - PullRequest
297 голосов
/ 21 октября 2011

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

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

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

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

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

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

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

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

Ищет ли bar.com ВЕЗДЕ из контроллеров внутри ftpFolderA2, и поэтому он находит еще один HomeController?Как я могу сказать, чтобы он смотрел только в папке «Контроллер» так, как должен?

Факты:

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

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

Ответы [ 26 ]

6 голосов
/ 24 сентября 2013

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

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

Например:

Сделано это:

public class HomeController : Controller
{

Вместо:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {
6 голосов
/ 04 апреля 2013

Вы также можете получить ошибку 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, поскольку Web API не знает, какую из них использовать.

5 голосов
/ 28 мая 2015

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

 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) }
        );
4 голосов
/ 17 марта 2016

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

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

2 голосов
/ 25 апреля 2016

В Route.config

пространства имен: new [] {"Appname.Controllers"}

2 голосов
/ 27 февраля 2016

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

1 голос
/ 12 января 2017

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

1 голос
/ 28 ноября 2016

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

1 голос
/ 27 апреля 2017

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

1 голос
/ 03 мая 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...