[英]MVC5 Multiple types were found that match the controller named '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 文件夾呢?
事實:
有人可以確認這是問題嗎?
這是您可能會遇到此錯誤的另一種情況。 如果重命名項目以更改程序集的文件名,則可能有兩個版本的 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.