В настоящее время у меня есть два несвязанных проекта MVC3, размещенных онлайн.
Один работает нормально, другой не работает, выдавая ошибку:
Найдено несколько типов, соответствующих контроллеру с именем «Home». Это может произойти, если маршрут, обслуживающий этот запрос ('{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.
Может кто-нибудь подтвердить, что это проблема?
источник
Ответы:
Это сообщение об ошибке часто появляется, когда вы используете области, и у вас есть одинаковое имя контроллера внутри области и корня. Например, у вас есть два:
~/Controllers/HomeController.cs
~/Areas/Admin/Controllers/HomeController.cs
Чтобы решить эту проблему (как подсказывает вам сообщение об ошибке), вы можете использовать пространства имен при объявлении маршрутов. Итак, в определении основного маршрута
Global.asax
:и в вашем
~/Areas/Admin/AdminAreaRegistration.cs
:Если вы не используете области, кажется, что оба ваших приложения размещены в одном и том же приложении ASP.NET, и возникают конфликты, потому что у вас одинаковые контроллеры, определенные в разных пространствах имен. Вам нужно будет настроить IIS для размещения этих двух как отдельных приложений ASP.NET, если вы хотите избежать подобных конфликтов. Попросите вашего хостинг-провайдера об этом, если у вас нет доступа к серверу.
источник
Вот еще один сценарий, в котором вы можете столкнуться с этой ошибкой. Если вы переименуете свой проект так, что имя файла сборки изменится, возможно, у вас будет две версии сборки ASP.NET, которые будут воспроизводить эту ошибку.
Решение состоит в том, чтобы перейти к вашей
bin
папке и удалить старые библиотеки. (Я попробовал «Перестроить проект», но он не удалил их, поэтому обязательно проверьте,bin
чтобы они исчезли)источник
В MVC4 и MVC5 это немного отличается, используйте следующее
/App_Start/RouteConfig.cs
и в районах
источник
Посмотрите это ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas
Тогда эта картина (надеюсь, вам понравятся мои рисунки)
источник
То, что говорили другие, правильно, но для тех, кто все еще сталкивается с той же проблемой:
в моем случае это произошло потому, что я скопировал другой проект и переименовал его во что-то еще, НО предыдущие выходные файлы в
bin
папке все еще были там ... И, к сожалению,Build -> Clean Solution
после переименования ударил проект и егоNamespaces
не удаляет их ... так что удаление их вручную решило мою проблему!источник
в
bin/
папке вашего проектаубедитесь, что у вас есть только ваша PROJECT_PACKAGENAME.DLL
и удалите ANOTHER_PROJECT_PACKAGENAME.DLL
которые могут появиться здесь по ошибке или вы просто переименуете свой проект
источник
Проверьте папку bin, если есть другой файл dll, который может конфликтовать с классом homeController.
источник
Другое решение - зарегистрировать пространство имен по умолчанию в ControllerBuilder. Поскольку у нас было много маршрутов в нашем основном приложении и только один общий маршрут в наших областях (где мы уже указывали пространство имен), мы обнаружили, что это самое простое решение:
источник
Даже если вы не используете области, вы все равно можете указать в RouteMap, какое пространство имен использовать
Но похоже, что проблема заключается в том, как ваши два приложения настроены в IIS
источник
У меня просто была эта проблема, но только когда я публиковал на своем веб-сайте, на моей локальной отладке она работала нормально. Я обнаружил, что должен был использовать FTP с моего веб-хоста, зайти в мой каталог публикации и удалить файлы в папке BIN, при их локальном удалении ничего не происходило при публикации.
источник
Может быть другой случай с областями, даже если вы выполнили все этапы маршрутизации в областях (например, предоставление пространств имен в глобальной таблице маршрутизации), а именно:
Например:
Сделано это:
Вместо того:
источник
Вы также можете получить ошибку 500, если добавите свою собственную сборку, содержащую ApiController, переопределив GetAssemblies объекта DefaultAssembliesResolver, и он уже находится в массиве из base.GetAssemblies ()
Дело в точке:
Если приведенный выше код находится в той же сборке, что и ваш контроллер, эта сборка будет в списке дважды и выдаст ошибку 500, поскольку Web API не знает, какую из них использовать.
источник
если вы хотите разрешить это автоматически .. вы можете использовать приложение самостоятельно, просто добавив следующий код:
источник
Возникла такая же проблема и ничего не помогло. Проблема в том, что у меня фактически нет дубликатов, эта ошибка появляется после переключения пространства имен проекта с
MyCuteProject
наMyCuteProject.Web
.В итоге я понял, что источником ошибки является
global.asax
файл - разметка XML, а не.cs
-codebehind. Проверьте пространство имен в нем - это помогло мне.источник
Я просто удалил папку «Bin» с сервера и скопировал мой bin на сервер, и моя проблема решена.
источник
В Route.config
пространства имен: new [] {"Appname.Controllers"}
источник
Мы обнаружили, что получили эту ошибку, когда в нашей сборке возник конфликт, который выглядел как предупреждение.
Мы не получили детали, пока не увеличили Visual Studio -> Tools -> Options -> Projects and Solutions -> Build and Run -> MSBuild - подробность сборки проекта.
Наш проект представляет собой веб-приложение .net v4, и возник конфликт между System.Net.Http (v2.0.0.0) и System.Net.Http (v4.0.0.0). Наш проект ссылался на версию v2 файла из пакета (включенного с помощью nuget). Когда мы удалили ссылку и добавили ссылку на версию v4, сборка работала (без предупреждений), и ошибка была исправлена.
источник
Другой вариант этой ошибки - когда вы используете resharper и используете некоторые «авто» опции рефакторинга, которые включают изменение имени пространства имен. Это то, что случилось со мной. Чтобы решить проблему с таким сценарием, удалите папку
bin
источник
Щелкните правой кнопкой мыши проект и выберите «Очистить проект». Или же полностью очистите каталог bin и затем пересоберите заново. Это должно очистить от любых оставшихся сборок из предыдущих сборок
источник
Некоторое время в одном приложении эта проблема также возникает. В этом случае установите флажок при публикации приложения.
источник
Если бы это могло помочь другим, я тоже столкнулся с этой ошибкой. Проблема была вызвана неправильной ссылкой на мой веб-сайт. По неизвестной причине мой веб-сайт ссылался на другой веб-сайт, в том же решении. И как только я удалил эту плохую ссылку, все стало работать правильно.
источник
Если вы работаете в Episerver или другой CMS на основе MVC, вы можете обнаружить, что это конкретное имя контроллера уже заявлено.
Это случилось со мной при попытке создать контроллер под названием
FileUpload
.источник
я столкнулся с аналогичной проблемой. и основной причиной было то, что у меня был один и тот же контроллер в двух разных областях. как только я удаляю один из них, он работает нормально.
у меня это будет полезно для вас.
источник
У меня есть два проекта в одном решении с тем же именем контроллера. Я удалил вторую ссылку проекта в первом проекте, и проблема решена
источник
Я обнаружил, что эта ошибка может возникать на традиционном веб-сайте ASP.NET при создании контроллера в каталоге, отличном от App_Code (иногда Visual Studio предотвращает это).
Он устанавливает тип файла «Компилировать», в то время как любой код, добавленный к «App_Code», устанавливается в «Содержимое». Если вы копируете или перемещаете файл в App_Code, тогда он все еще установлен как «Компилировать».
Я подозреваю, что это как-то связано с работой проекта веб-сайта, так как проекты веб-сайта не выполняют никаких операций сборки. Очистка папки bin и изменение ее на «Content», кажется, исправят это.
источник