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


318

На даний момент в Інтернеті розміщено два споріднені проекти MVC3.

Один працює нормально, інший не працює, даючи мені помилку:

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

У такому випадку зареєструйте цей маршрут, викликавши перевантаження методу "MapRoute", який приймає параметр "простори імен".

Те, як працює мій хостинг, полягає в тому, що він дає мені доступ до FTP, і в цій папці у мене є дві інші папки, по одній для кожного з моїх додатків.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

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

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

Шукає bar.com від контролерів ВСЕ, що знаходиться всередині ftpFolderA2, і саме тому він знаходить інше HomeController? Як я можу сказати, щоб він виглядав лише у папці Контролер як слід?

Факти:

  1. Не використовуйте ділянки. Це два ПОСЛІДНО не пов'язаних між собою проекти. Я розміщую кожен опублікований проект у кожній відповідній папці. Нічого фантазійного.
  2. Кожен проект має лише 1 HomeController.

Чи може хтось підтвердити, що це проблема?


Дуже незрозуміле питання. Ви використовуєте райони? Проблема виникає локально?
Дарин Димитров

1
@Darin: Редагував цю інформацію в.
Лише болівійський тут

Відповіді:


473

Це повідомлення про помилку часто трапляється, коли ви використовуєте області та у вас однакова назва контролера всередині області та кореня. Наприклад, у вас є два:

  • ~/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, якщо ви хочете уникнути подібних конфліктів. Попросіть цього провайдера хостингу, якщо у вас немає доступу до сервера.


Я взагалі не використовую області. Це два абсолютно неспоріднених програми, що знаходяться в окремій папці всередині кореневої папки FTP. Можливо, моя програма шукає контролерів MVC скрізь, де вона може, і це охоплення просто так поширюється на інший домашній контролер. Як я можу сказати, щоб він ніде не шукав, але це власна папка Controller і не враховувати решту?
Лише болівійська тут

2
@SergioTapia, схоже, вони досить пов'язані з вашими програмами. Ваш хостинг-провайдер розмістив їх у тому ж додатку ASP.NET. Вам доведеться попросити його розділити їх на IIS як окремі екземпляри, або у вас виникне багато проблем.
Дарин Димитров

13
Дякую. В ASP MVC 4.0 вам потрібно передати названий аргумент, як простори імен: new [] {"AppName.Areas.Admin.Controllers"}
om471987

1
+1 - добре працює. Я не розумів, що існує окрема зона для реєстрації маршруту в районах. Куди б я не дивився, здається, що від Даріна є відповідь на якість:
Тревіс J

1
Якщо ви використовуєте області та хочете простір імен контролерів, вам потрібно простір імен як маршрутів всередині області, так і зовні. Лише проміжок часу по маршруту все ще викликав у мене це питання.
Гевін Уорд

528

Ось ще один сценарій, коли ви можете зіткнутися з цією помилкою. Якщо ви перейменовуєте свій проект так, щоб ім'я файлу збірки змінилося, можливо, у вас є дві версії вашої збірки ASP.NET, які відтворять цю помилку.

Рішення полягає в тому, щоб перейти до вашої binпапки та видалити старі dlls. (Я спробував "Відновити проект", але це не видалило їх, тому обов'язково перевірте, binчи не перейшло їх)


1
Інша зміна цієї помилки - це коли ви користуєтеся resharper і використовуєте деякі "автоматичні" параметри рефактора, які включають зміну імені простору імен. Саме це сталося зі мною.
Себастьян 506563

5
Якщо ви отримуєте це через службу додатків Azure, перейдіть за посиланням https: // <your_app_name_here> .scm.azurewebsites.net / DebugConsole, щоб увійти та видалити файли.
Том Блоджет

5
Thx це була проблема для мене. Я створив "новий" проект, скопіювавши / вставивши існуючий проект у нову папку; старі DLL склали, видаливши папку бін, видалили її
brando

Це я отримав під час переміщення файлів проектів на другий диск. Очищення папки бін вирішує її. Дивна даремна річ.
Роберто Боніні

Ну, це була болісно дратівлива помилка з дуже простим виправленням. Дякую!
Троя Гросфілд

63

У 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" }
            );

39

Дивіться це ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Тоді ця картина (сподіваюся, вам подобаються мої малюнки)

введіть тут опис зображення


Вирішили питання ..! :)
Аруна

1
@ppumkin повідомте про це сліпому програмісту. Цей текст можна прочитати читачами екрану
Карлос Муньос

Привіт Карлосе. Так, я розумію ситуацію. Це вже важко пояснити це людям без обмежень видимості. Я навіть не впевнений, що будь-яке допоміжне програмне забезпечення зможе добре описати те, що відбувається на знімку, для будь-якого органу. Це дійсно доводить до відома, що відповідь, ймовірно, повинен мати текст, принаймні намагаючись описати, що відбувається.
Пьотр Кула

32

Інші сказали, що це правильно, але для тих, хто все ще стикається з тією ж проблемою:
У моєму випадку це сталося тому, що я скопіював інший проект, н перейменував його на щось інше, але попередні вихідні файли в binпапці все ще були там ... І, на жаль, натискання Build -> Clean Solutionпісля перейменування на Проект і його Namespaces не видаляє ... так що видалення їх вирішило мою проблему вручну!


2
Ваша пропозиція врятувала мене
Абхіманью,

1
я теж, дякую, чистий dosnt насправді означає чистий, grrrr
katibaer

1
Дякую @DrTJ Це дуже засмутило! Ви очікуєте, що чистий процес чистих роботи, а очікування - корінь невдач. Це врятувало мене, витягаючи волосся далі!
Майк

28

у bin/папці вашого проекту

переконайтеся, що у вас є лише ваш PROJECT_PACKAGENAME.DLL

та видаліть ANOTHER_PROJECT_PACKAGENAME.DLL

які можуть з’явитися тут помилково або ви просто перейменовуєте свій проект


2
Саме моє питання. Дякую.
Детіліум

Працювали для мене! дякує!
eyal

Я змінив назву збірки і в кошику сиділо кілька старих копалень. Спасибі
apc

Дякую! Я не можу повірити, що я пропустив щось таке просте.
Ваш

25

Перевірте папку bin, чи є інший файл dll, який може суперечити класу homeController.


7
Це трохи мене скопіювало під час копіювання проекту та перейменування його ... старий проект з назвою dll все ще знаходився у відро, очищення не видаляло його ... Мені довелося видалити його вручну!
Пол Захра

2
Це було для мене проблемою. Колега помилково додав посилання від одного передового проекту до іншого, створюючи цю проблему. Він видалив посилання, таким чином Visual Studio також видалив файли dll на своєму диску. Я витягнув оновлення з Git, посилань не було, але файли dll залишилися, щоправда, чистим. Просто тому, що мій ВС більше не бачив посилання. Але при запуску IIS бачив файли та використовував їх. Видалення їх з мого диска допомогло.
Єронімо

14

Ще одне рішення - зареєструвати простір імен за замовчуванням за допомогою ControllerBuilder. Оскільки в нашому головному додатку було багато маршрутів і лише один загальний маршрут у наших районах (де ми вже вказували простір імен), ми знайшли це найпростішим рішенням:

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

Так було для мене. Якщо у вас справді є кілька контролерів з тим самим іменем, це може знадобитися після додавання просторів імен до визначень маршруту. Наприклад, для вашої домашньої сторінки, де контролер та область явно не вибрані шляхом.
Джейсон Бек

У проекті, над яким я працюю, ми маємо основну програму під ключ із областями для роботи з клієнтами. У кожному з них є контролер "налаштувань". Ця відповідь є чудовою альтернативою для визначення маршруту для контролера налаштувань для кожної області.
Дін Деррека

7

Незважаючи на те, що ви не використовуєте області, ви все одно можете вказати у своїй RouteMap, який простір імен використовувати

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

Але це здається, що власне проблема полягає в тому, як ваші дві програми налаштовані в IIS


7

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


Це було виправданням для мене. Мій профіль публікації не видаляв файли, які не представлені локально, тому в моєму додатку вибрано старі dll на додаток до нових та знайдено повторювані типи.
Форма

1
Я змінив назву проекту, і я переломлив усі файли, але потім у мене з’явилася ця помилка. Видалення папки бін працювало і для мене.
Мауро Вальвано

6

Можливо, є інший випадок із " Областями", навіть якщо ви дотримуєтесь усіх кроків маршрутизації в областях (наприклад, введення просторів імен у глобальній таблиці маршрутизації), а саме:

Можливо, ви не загорнули глобальний контролер у "простір імен", який ви надали для маршрутизації.

Наприклад:

Зробив це:

public class HomeController : Controller
{

Замість:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

Так, недостатньо просто надати простір імен у MapRoute. Наданий тут простір імен повинен відповідати простору імен класу контролера, в якому знаходиться. Зараз він працює!
DanKodi

6

Ви також можете отримати помилку 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 не знає, який саме використовувати.


6

якщо ви хочете вирішити це автоматично .. ви можете використовувати програму, мабуть, просто додати наступний код:

 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) }
        );

1
чудове рішення, якщо у кількох проектах є однакові контролери
Раві Ананд,

4

Отримали такі ж клопоти і нічого не допомогло. Проблема полягає в тому, що я фактично не маю дублікатів, ця помилка з’являється після переключення простору імен проектів з MyCuteProjectна MyCuteProject.Web.

Врешті-решт я зрозумів, що джерелом помилки є global.asaxфайл - розмітка XML, а не- .cscodebehind. Перевірте в ньому простір імен - це мені допомогло.


2

Я тільки що видалив папку "Смеття" з сервера і скопіював свій смітник на сервер, і моя проблема була вирішена.



1

Ми виявили, що цю помилку ми отримали, коли в нашій збірці виник конфлікт, який виявився як попередження.

Ми не отримали деталей, поки не збільшили Visual Studio -> Інструменти -> Опції -> Проекти та рішення -> Створити та запустити -> Проект MSBuild збільшить багатослідовність виводу на Деталі.

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


1

Інша зміна цієї помилки - це коли ви користуєтеся resharper і використовуєте деякі "автоматичні" параметри рефактора, які включають зміну імені простору імен. Це те, що трапляється зі мною. Щоб вирішити проблему з подібним сценарієм, видаліть папкуbin


Це сталося зі мною, коли я скопіював вміст 1 проекту над вмістом іншого. Мені довелося видалити конкретні файли з папки bin
Adriaan Davel

1

Клацніть правою кнопкою миші проект і виберіть проект «Очистити проект». Або ще повністю випорожніть каталог сміття, а потім знову заново створіть. Це повинно очищати будь-які залишені збірки попередніх збірок


1

Деякий час в одній програмі також надходить цей випуск. У цьому випадку виберіть ці прапорці під час публікації заявки введіть тут опис зображення


1

Якщо це може допомогти іншим, я також зіткнувся з цією помилкою. Проблема була причиною через неправильне посилання на мене веб-сайт. З незрозумілої причини мій веб-сайт посилався на інший веб-сайт у тому самому рішенні. І як тільки я усуну цю погану посилання, річ почала працювати належним чином.


0

Якщо ви працюєте в Episerver або іншій CMS на базі MVC, ви можете виявити, що саме на це ім’я контролера вже заявлено права.

Це сталося зі мною при спробі створити контролер, який називається FileUpload.


0

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

у мене це буде корисно для вас.

Проектне рішення


0

У мене два проекти в одному рішенні з тим же ім'ям контролера. Я видалив другий довідник проекту в першому проекті і питання вирішено


0

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

Він встановлює тип файлу "Компілювати", тоді як будь-який код, доданий до "App_Code", встановлений у "Вміст". Якщо ви скопіюєте або перемістіть файл у App_Code, він все ще встановлений як "Компілювати".

Я підозрюю, що це має відношення до роботи веб-проекту, оскільки проекти веб-сайтів не мають жодної операції збирання. Очищення папки бін та зміна на "Зміст", схоже, це виправляє.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.