簡體   English   中英

發現多種類型與名為“Home”的控制器相匹配

[英]Multiple types were found that match the controller named 'Home'

我目前有兩個不相關的 MVC3 項目在線托管。

一個工作正常,另一個不起作用,給我錯誤:

找到了多種與名為“Home”的控制器相匹配的類型。 如果為此請求提供服務的路由 ('{controller}/{action}/{id}') 沒有指定命名空間來搜索與請求匹配的控制器,就會發生這種情況。

如果是這種情況,請通過調用采用“namespaces”參數的“MapRoute”方法的重載來注冊此路由。

我的托管人的工作方式是他給我 FTP 訪問權限,並且在該文件夾中我有另外兩個文件夾,一個用於我的每個應用程序。

ftpFolderA2/foo.com

ftpFolderA2/bar.com

foo.com 工作正常,我將我的應用程序發布到我的本地文件系統,然后 FTP 內容並且它工作正常。

當我上傳並嘗試運行 bar.com 時,上述問題會觸發並阻止我使用我的網站。 foo.com 仍然有效

bar.com 是否從 ftpFolderA2 內部的控制器中搜索,這就是它尋找另一個HomeController的原因? 我怎么能告訴它只查看 Controller 文件夾呢?

事實:

  1. 不使用區域。 這是兩個完全不相關的項目。 我將每個已發布的項目放入各自的文件夾中。 沒有什么花哨。
  2. 每個項目只有 1 個 HomeController。

有人可以確認這是問題嗎?

這是您可能會遇到此錯誤的另一種情況。 如果重命名項目以更改程序集的文件名,則可能有兩個版本的 ASP.NET 程序集,這將重現此錯誤。

解決方案是轉到您的bin文件夾並刪除舊的 dll。 (我試過“重建項目”,但這並沒有刪除它們,所以一定要檢查bin以確保它們消失了)

當您使用區域並且您在區域和根中具有相同的控制器名稱時,通常會發生此錯誤消息。 例如你有兩個:

  • ~/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 應用程序托管。 如果您無權訪問服務器,請咨詢您的托管服務提供商。

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

看這個...http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

然后這張圖(希望你喜歡我的畫)

在此處輸入圖片說明

其他人說的是正確的,但對於那些仍然面臨同樣問題的人:
在我的情況下,發生這種情況是因為我復制了另一個項目並將其重命名為其他內容,bin文件夾中以前的輸出文件仍然存在......不幸的是,在重命名項目及其Namespaces后點擊Build -> Clean Solution並沒有刪除它們...所以手動刪除它們解決了我的問題!

在您的項目bin/文件夾中

確保您只有PROJECT_PACKAGENAME.DLL

並刪除ANOTHER_PROJECT_PACKAGENAME.DLL

可能會錯誤地出現在這里,或者您只是重命名您的項目

檢查bin文件夾是否有另一個可能與 homeController 類沖突的 dll 文件。

另一種解決方案是使用 ControllerBuilder 注冊一個默認命名空間。 由於我們的主應用程序中有很多路由,而我們的區域中只有一個通用路由(我們已經指定了命名空間),我們發現這是最簡單的解決方案:

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

即使您沒有使用區域,您仍然可以在 RouteMap 中指定要使用的命名空間

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

但聽起來實際問題是您的兩個應用程序在 IIS 中的設置方式

如果你想自動解決它..你可以使用該應用程序 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) }
        );

我剛剛遇到了這個問題,但只有當我發布到我的網站時,在我的本地調試中它才能正常運行。 我發現我必須從我的網絡主機使用 FTP 並進入我的發布目錄並刪除 BIN 文件夾中的文件,當我發布時在本地刪除它們沒有任何作用。

如果您通過覆蓋 DefaultAssembliesResolver 的 GetAssemblies 添加包含 ApiController 的自己的程序集,並且它已經在 base.GetAssemblies() 的數組中,您也可能會收到 500 錯誤

案例:

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 不知道要使用哪個。

即使您遵循了區域中路由的所有步驟(例如在全局路由表中給出命名空間),區域也可能存在另一種情況,即:

您可能沒有將全局控制器包裝在路由中提供的“命名空間”中。

例如:

這樣做:

public class HomeController : Controller
{

代替:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

遇到了同樣的麻煩,沒有任何幫助。 問題是我實際上沒有任何重復項,在將項目命名空間從MyCuteProject切換到MyCuteProject.Web后會出現此錯誤。

最后我意識到錯誤的來源是global.asax文件——XML 標記,而不是.cs -codebehind。 檢查其中的命名空間 - 這對我有幫助。

在 Route.config 中

命名空間:new[] {“Appname.Controllers”}

我剛剛從服務器中刪除了文件夾“Bin”並將我的 bin 復制到服務器,我的問題就解決了。

有時在單個應用程序中也會出現此問題 在這種情況下,在發布應用程序時選中這些復選框在此處輸入圖片說明

如果您的應用程序的bin文件夾中有另一個DLL,並且該DLL具有名為Home的控制器但位於與HomeController不同的命名空間中,則也可能發生這種情況。

例如,如果您更改了項目的名稱並且仍然從舊項目編譯了二進制文件,那么即使通過選擇“ 清理解決方案”菜單命令來清理解決方案 ,舊的二進制文件仍將保留。

如果任何舊的二進制文件具有相同的控制器名稱(如果您只是更改項目程序集名稱和一些名稱空間,它們將會是這樣),您可能會遇到此問題。

確保從bin文件夾中刪除您不需要的所有其他程序集。

這是一個視頻演示: https//youtu.be/8Snz2ySTAU8

我們發現當我們的構建中出現沖突並顯示為警告時,我們會收到此錯誤。

直到我們將 Visual Studio -> 工具 -> 選項 -> 項目和解決方案 -> 構建和運行 -> MSBuild 項目構建輸出詳細程度增加到詳細信息,我們才獲得詳細信息。

我們的項目是一個 .net v4 Web 應用程序,System.Net.Http (v2.0.0.0) 和 System.Net.Http (v4.0.0.0) 之間存在沖突。 我們的項目從包(使用 nuget 包含)中引用了該文件的 v2 版本。 當我們刪除引用並添加對 v4 版本的引用時,構建工作(沒有警告)並且錯誤被修復。

此錯誤的其他變體是當您使用 resharper 並使用一些包含名稱空間名稱更改的“自動”重構選項時。 這就是發生在我身上的事情。 解決這種場景刪除文件夾bin

右鍵單擊項目並選擇清理項目。 或者完全清空 bin 目錄,然后重新構建。 這應該清除以前構建中的任何剩余程序集

如果它可以幫助其他人,我也面臨這個錯誤。 問題是由我網站中的錯誤引用引起的。 由於未知原因,我的網站在同一解決方案中引用了另一個網站。 一旦我刪除了那個錯誤的引用,事情就開始正常工作了。

如果您在 Episerver 或其他基於 MVC 的 CMS 中工作,您可能會發現該特定控制器名稱已被聲明。

我在嘗試創建名為FileUpload的控制器時發生了這種情況。

我面臨着類似的問題。 主要原因是我在兩個不同的區域有相同的控制器。 一旦我刪除其中之一,它就可以正常工作。

我有它對你有幫助。

項目解決方案

我在一個解決方案中有兩個項目,控制器名稱相同。 我刪除了第一個項目中的第二個項目參考,問題已解決

我發現當您在非 App_Code 目錄中創建控制器時,傳統 ASP.NET 網站可能會發生此錯誤(有時 Visual Studio 會阻止這種情況)。

它將文件類型設置為“編譯”,而添加到“App_Code”的任何代碼都設置為“內容”。 如果您將文件復制或移動到 App_Code 中,則它仍設置為“編譯”。

我懷疑它與網站項目操作有關,因為網站項目沒有任何構建操作。清除 bin 文件夾並更改為“內容”似乎可以解決它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM