Nhiều loại đã được tìm thấy khớp với bộ điều khiển có tên 'Home'


318

Tôi hiện có hai dự án MVC3 không liên quan được lưu trữ trực tuyến.

Một cái hoạt động tốt, cái kia không hoạt động, cho tôi lỗi:

Nhiều loại đã được tìm thấy khớp với bộ điều khiển có tên 'Home'. Điều này có thể xảy ra nếu tuyến đường phục vụ yêu cầu này ('{bộ điều khiển} / {hành động} / {id}') không chỉ định không gian tên để tìm kiếm bộ điều khiển phù hợp với yêu cầu.

Nếu đây là trường hợp, hãy đăng ký tuyến đường này bằng cách gọi quá tải phương thức 'MapRoute' có tham số 'không gian tên'.

Cách thức hoạt động của hoster là anh ấy cho tôi quyền truy cập FTP và trong thư mục đó tôi có hai thư mục khác, một cho mỗi ứng dụng của tôi.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com hoạt động tốt, tôi xuất bản ứng dụng của mình lên hệ thống tệp cục bộ sau đó FTP nội dung và nó hoạt động.

Khi tôi tải lên và cố gắng chạy bar.com, sự cố ở trên sẽ kích hoạt và ngăn tôi sử dụng trang web của mình. Tất cả trong khi foo.com vẫn hoạt động .

Có phải bar.com đang tìm kiếm từ bộ điều khiển MỌI NƠI bên trong ftpFolderA2 và đó là lý do tại sao nó tìm thấy cái khác HomeController? Làm thế nào tôi có thể bảo nó chỉ tìm trong thư mục Bộ điều khiển khi cần?

Sự thật:

  1. Không sử dụng khu vực. Đây là hai dự án HOÀN TOÀN không liên quan. Tôi đặt từng dự án được xuất bản vào từng thư mục tương ứng. Không có gì lạ mắt.
  2. Mỗi dự án chỉ có 1 HomeContoder.

Ai đó có thể xác nhận đây là vấn đề?


Câu hỏi rất không rõ ràng. Bạn đang sử dụng các khu vực? Có vấn đề xảy ra cục bộ?
Darin Dimitrov

1
@Darin: Đã chỉnh sửa thông tin đó trong.
Chỉ người Bolivian ở đây vào

Câu trả lời:


473

Thông báo lỗi này thường xảy ra khi bạn sử dụng các khu vực và bạn có cùng tên bộ điều khiển bên trong khu vực và thư mục gốc. Ví dụ: bạn có hai:

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs

Để giải quyết vấn đề này (như thông báo lỗi gợi ý cho bạn), bạn có thể sử dụng không gian tên khi khai báo các tuyến đường của mình. Vì vậy, trong định nghĩa tuyến đường chính trong Global.asax:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Controllers" }
);

và trong ~/Areas/Admin/AdminAreaRegistration.cs:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

Nếu bạn không sử dụng các khu vực, có vẻ như cả hai ứng dụng của bạn được lưu trữ bên trong cùng một ứng dụng ASP.NET và xảy ra xung đột do bạn có cùng các bộ điều khiển được xác định trong các không gian tên khác nhau. Bạn sẽ phải cấu hình IIS để lưu trữ hai ứng dụng đó thành các ứng dụng ASP.NET riêng biệt nếu bạn muốn tránh các loại xung đột như vậy. Hỏi nhà cung cấp dịch vụ lưu trữ của bạn về điều này nếu bạn không có quyền truy cập vào máy chủ.


Tôi hoàn toàn không sử dụng các khu vực. Đây là hai ứng dụng hoàn toàn không liên quan nằm trong thư mục riêng bên trong thư mục gốc FTP. Có thể ứng dụng của tôi đang tìm kiếm bộ điều khiển MVC ở mọi nơi có thể và điều đó chỉ xảy ra để mở rộng sang Bộ điều khiển gia đình khác. Làm thế nào tôi có thể bảo nó không nhìn ở bất cứ đâu ngoài thư mục Bộ điều khiển riêng và bỏ qua phần còn lại?
Chỉ Bolivian ở đây

2
@SergioTapia, có vẻ như chúng khá liên quan đến các ứng dụng của bạn. Nhà cung cấp dịch vụ lưu trữ của bạn đặt chúng bên trong cùng một ứng dụng ASP.NET. Bạn sẽ phải yêu cầu anh ta tách chúng trong IIS thành các trường hợp riêng biệt hoặc bạn sẽ gặp nhiều vấn đề.
Darin Dimitrov

13
Cảm ơn. Trong ASP MVC 4.0, bạn cần truyền đối số có tên như không gian tên: new [] {"AppName.Areas.Admin.Controllers"}
om471987

1
+1 - Hoạt động tốt. Tôi đã không nhận ra rằng có một khu vực riêng để đăng ký tuyến đường trong khu vực. Ở mọi nơi tôi nhìn thấy dường như có một câu trả lời chất lượng từ Darin :)
Travis J

1
Nếu bạn đang sử dụng các khu vực và muốn không gian tên bộ điều khiển, bạn cần phải đặt không gian tên cả các tuyến đường bên trong khu vực bên ngoài. Chỉ đặt tên cho tuyến đường khu vực vẫn cho tôi vấn đề này.
Phường Gavin

528

Đây là một kịch bản khác mà bạn có thể phải đối mặt với lỗi này. Nếu bạn đổi tên dự án của mình để tên tệp của tập hợp thay đổi, bạn có thể có hai phiên bản lắp ráp ASP.NET, điều này sẽ tái tạo lỗi này.

Giải pháp là vào binthư mục của bạn và xóa các dll cũ. (Tôi đã thử "Dự án xây dựng lại", nhưng điều đó không xóa chúng, vì vậy hãy đảm bảo kiểm tra binđể đảm bảo chúng biến mất)


1
Biến thể khác của lỗi này là khi bạn sử dụng chia sẻ lại và bạn sử dụng một số tùy chọn cấu trúc lại "tự động" bao gồm thay đổi tên không gian tên. Đây là những gì xảy ra với tôi.
Sebastian 506563

5
Nếu bạn nhận được điều này từ Dịch vụ ứng dụng Azure, hãy truy cập https: // <your_app_name_here> .scm.azurewebsites.net / DebugConsole để đăng nhập và xóa tệp.
Tom Blodget

5
Thx đây là vấn đề đối với tôi. Tôi đã tạo một dự án "mới" bằng cách sao chép / dán dự án hiện có vào một thư mục mới; các bản dựng cũ đi kèm, xóa thư mục bin đã xóa sạch
brando

Tôi đã nhận được điều này khi di chuyển các tập tin dự án của tôi sang một ổ đĩa thứ hai. Xóa thư mục bin giải quyết nó. Điều kỳ lạ nhất.
Roberto Bonini

Vâng, đó là một lỗi khó chịu với một sửa chữa rất đơn giản. Cảm ơn!
Troy Grosfield

63

Trong MVC4 & MVC5 Nó hơi khác một chút, sử dụng như sau

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

và trong khu vực

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );

39

Xem này ... http://www.asp.net/mvc/ideo/mvc-2/how-do-i/aspnet-mvc-2-areas

Sau đó, hình ảnh này (hy vọng bạn thích bản vẽ của tôi)

nhập mô tả hình ảnh ở đây


Giải quyết vấn đề ..! :)
Aruna

1
@ppumkin nói điều đó với một lập trình viên mù. Các văn bản có thể được đọc bởi các trình đọc màn hình
Carlos Muñoz

Chao Carlos. Có tôi hiểu tình hình. Nó đã khó khăn để giải thích nó mọi người mà không có khuyết tật tầm nhìn. Tôi thậm chí không chắc chắn bất kỳ loại phần mềm hỗ trợ nào có thể mô tả tốt những gì đang diễn ra trong bức tranh cho bất kỳ cơ thể nào. Nó gây chú ý rằng câu trả lời có lẽ nên có văn bản ít nhất là cố gắng mô tả những gì đang diễn ra.
Piotr Kula

32

Những gì người khác nói là đúng nhưng với những người vẫn gặp phải vấn đề tương tự:
Trong trường hợp của tôi, điều đó xảy ra do tôi đã sao chép một dự án khác, đổi tên thành một cái khác NHƯNG các tệp đầu ra trước đó trong binthư mục vẫn còn đó ... Và thật không may, nhấn Build -> Clean Solutionsau khi đổi tên dự án và nó Namespaces không xóa chúng ... vì vậy xóa chúng bằng tay giải quyết vấn đề của tôi!


2
đề nghị của bạn đã cứu tôi
Abhimanyu

1
tôi cũng vậy, cảm ơn, sạch dosnt thực sự có nghĩa là sạch sẽ,
grrrr

1
Cảm ơn bạn @DrTJ Điều này thật là bực bội! Bạn mong đợi quá trình làm sạch dang để làm việc và kỳ vọng là gốc rễ của thất bại. Điều này tiết kiệm cho tôi kéo tóc ra xa hơn!
Mike

28

trong dự án của bạn bin/ thư mục

hãy chắc chắn rằng bạn chỉ có PRO DỰ ÁN_ACKAGENAME.DLL

và xóa ANOTHER_PROJECT_PACKAGENAME.DLL

có thể xuất hiện ở đây do nhầm lẫn hoặc bạn chỉ đổi tên dự án của bạn


2
Chính xác là vấn đề của tôi. Cảm ơn bạn.
Detilium

Đã làm cho tôi! thnks!
mắt

Tôi đã thay đổi tên lắp ráp và có một số dll cũ ngồi trong thùng. Cảm ơn
apc

Cảm ơn bạn! Tôi không thể tin rằng tôi đã bỏ lỡ một cái gì đó rất đơn giản.
Vash

25

Kiểm tra thư mục bin nếu có tệp dll khác có thể xung đột với lớp homeContoder.


7
Điều này làm tôi bực mình khi sao chép một dự án và đổi tên nó ... dự án cũ có tên dll vẫn còn trong thùng, việc dọn dẹp không xóa nó ... Tôi phải tự xóa nó!
Paul Zahra

2
Đây là vấn đề đối với tôi. Một đồng nghiệp được thêm vào do nhầm lẫn một tham chiếu từ một dự án front-end đến một dự án khác tạo ra vấn đề này. Anh ta xóa tham chiếu, do đó Visual Studio cũng xóa các tệp dll trên đĩa của anh ta. Tôi đã lấy bản cập nhật từ Git, các tài liệu tham khảo đã biến mất, nhưng các tệp dll vẫn còn, ngay cả khi đã sạch. Đơn giản vì VS của tôi không thấy tài liệu tham khảo nữa. Nhưng khi chạy IIS đã thấy các tập tin và sử dụng chúng. Loại bỏ chúng khỏi đĩa của tôi đã giúp.
Mitchonimo

14

Một giải pháp khác là đăng ký một không gian tên mặc định với ControllerBuilder. Vì chúng tôi có rất nhiều tuyến đường trong ứng dụng chính của chúng tôi và chỉ có một tuyến đường chung duy nhất trong khu vực của chúng tôi (nơi chúng tôi đã chỉ định một không gian tên), chúng tôi thấy đây là giải pháp đơn giản nhất:

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

Đây là trường hợp đối với tôi. Nếu bạn thực sự có nhiều bộ điều khiển có cùng tên, điều này có thể cần thiết sau khi bạn đã thêm không gian tên vào định nghĩa tuyến đường của mình. Ví dụ: đối với trang chủ của bạn nơi bộ điều khiển và khu vực không được chọn rõ ràng bởi đường dẫn.
Jason Beck

Trong dự án tôi làm việc, chúng tôi có một backoffice chìa khóa trao tay chính với các khu vực cho công việc khách hàng tùy chỉnh. Mỗi người có một bộ điều khiển 'cài đặt. Câu trả lời này là một thay thế tuyệt vời cho việc phải xác định tuyến đường cho bộ điều khiển cài đặt cho từng khu vực.
Derreck Dean

7

Mặc dù bạn không sử dụng các khu vực, bạn vẫn có thể chỉ định trong RouteMap mà không gian tên sẽ sử dụng

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

Nhưng có vẻ như vấn đề thực tế là cách hai ứng dụng của bạn được thiết lập trong IIS


7

Tôi chỉ gặp vấn đề này, nhưng chỉ khi tôi xuất bản lên trang web của mình, trên gỡ lỗi cục bộ của tôi, nó mới chạy tốt. Tôi thấy rằng tôi phải sử dụng FTP từ webhost của mình và đi vào thư mục xuất bản của mình và xóa các tệp trong thư mục BIN, xóa chúng cục bộ không làm gì khi tôi xuất bản.


Đây là bản sửa lỗi cho tôi. Hồ sơ xuất bản của tôi không xóa các tệp không xuất hiện cục bộ, vì vậy ứng dụng của tôi đã chọn các dll cũ ngoài các tệp mới và tìm thấy các loại trùng lặp.
Mẫu

1
Tôi đã thay đổi tên dự án của tôi và tôi đã khúc xạ tất cả các tập tin nhưng sau đó tôi đã gặp lỗi này. Xóa thư mục bin cũng làm việc cho tôi.
Mauro Valvano

6

Có thể có một trường hợp khác với các Vùng thậm chí bạn đã thực hiện theo tất cả các bước trong định tuyến trong Vùng (như đưa ra Không gian tên trong bảng định tuyến toàn cầu), đó là:

Bạn có thể không bao bọc (các) Bộ điều khiển Toàn cầu của mình trong 'không gian tên' mà bạn đã cung cấp trong định tuyến.

Ví dụ:

Thực hiện điều này:

public class HomeController : Controller
{

Thay vì:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

Có Không đủ để chỉ cung cấp một không gian tên trong MapRoute. Không gian tên được cung cấp ở đây cần khớp với không gian tên của lớp trình điều khiển nằm trong. Bây giờ nó hoạt động!
DanKodi

6

Bạn cũng có thể gặp lỗi 500 nếu bạn thêm phần lắp ráp của riêng mình có chứa ApiContoder bằng cách ghi đè GetAssemblies của DefaultAssembliesResolver và nó đã có trong mảng từ base.GetAssemblies ()

Trường hợp tại điểm:

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

nếu đoạn mã trên nằm trong cùng một cụm với Bộ điều khiển của bạn, thì cụm đó sẽ nằm trong danh sách hai lần và sẽ tạo ra một lỗi 500 do API Web không biết nên sử dụng cái nào.


6

nếu bạn muốn tự động giải quyết nó .. bạn có thể sử dụng ứng dụng một cách chắc chắn chỉ cần thêm đoạn mã sau:

 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
giải pháp tuyệt vời nếu bạn có cùng bộ điều khiển trong nhiều dự án
Ravi Anand

4

Gặp rắc rối tương tự và không có gì giúp được. Vấn đề là tôi thực sự không có bất kỳ sự trùng lặp nào, lỗi này xuất hiện sau khi chuyển đổi không gian tên dự án từ MyCuteProjectsangMyCuteProject.Web .

Cuối cùng, tôi nhận ra rằng nguồn lỗi là một global.asaxtệp - đánh dấu XML, không phải là .cs-codebehind. Kiểm tra không gian tên trong đó - điều đó đã giúp tôi.


2

tôi vừa xóa thư mục 'Bin' khỏi máy chủ và sao chép thùng của tôi vào máy chủ, và vấn đề của tôi đã được giải quyết.


2

Trong Route.config

không gian tên: new [] {"Appname.Controllers"}


1

Chúng tôi thấy rằng chúng tôi đã gặp lỗi này khi có xung đột trong bản dựng của chúng tôi xuất hiện dưới dạng cảnh báo.

Chúng tôi không nhận được thông tin chi tiết cho đến khi chúng tôi tăng Visual Studio -> Công cụ -> Tùy chọn -> Dự án và Giải pháp -> Xây dựng và Chạy -> Dự án MSBuild xây dựng mức độ chi tiết của chi tiết.

Dự án của chúng tôi là một ứng dụng web .net v4 và đã xảy ra xung đột giữa System.Net.Http (v2.0.0.0) và System.Net.Http (v4.0.0.0). Dự án của chúng tôi đã tham chiếu phiên bản v2 của tệp từ một gói (bao gồm sử dụng nuget). Khi chúng tôi xóa tham chiếu và thêm một tham chiếu cho phiên bản v4 thì bản dựng đã hoạt động (không có cảnh báo) và lỗi đã được sửa.


1

Biến thể khác của lỗi này là khi bạn sử dụng chia sẻ lại và bạn sử dụng một số tùy chọn cấu trúc lại "tự động" bao gồm thay đổi tên không gian tên. Đây là những gì xảy ra với tôi. Để giải quyết vấn đề với loại thư mục xóa kịch bản nàybin


Điều này xảy ra với tôi khi tôi sao chép vào nội dung của 1 dự án so với nội dung của dự án khác. Tôi đã phải xóa các tệp cụ thể khỏi thư mục bin
Adriaan Davel

1

Nhấp chuột phải vào dự án và chọn làm sạch dự án. Hoặc khác hoàn toàn làm trống thư mục bin và sau đó xây dựng lại. Điều này sẽ xóa bất kỳ hội đồng còn lại từ các bản dựng trước


1

Đôi khi trong một ứng dụng, Vấn đề này cũng xuất hiện Trong trường hợp đó, hãy chọn những hộp kiểm này khi bạn xuất bản ứng dụng của mình nhập mô tả hình ảnh ở đây


1

Nếu nó có thể giúp người khác, tôi cũng đã đối mặt với lỗi này. Vấn đề là do tham chiếu không chính xác trong trang web của tôi. Vì lý do không rõ trang web của tôi đã giới thiệu một trang web khác, trong cùng một giải pháp. Và một khi tôi loại bỏ tham chiếu xấu đó, mọi thứ bắt đầu hoạt động đúng.


0

Nếu bạn đang làm việc trong Episerver hoặc một CMS dựa trên MVC khác, bạn có thể thấy rằng tên bộ điều khiển cụ thể đó đã được xác nhận.

Điều này đã xảy ra với tôi khi cố gắng tạo một bộ điều khiển được gọi là FileUpload .


0

tôi đã phải đối mặt với vấn đề tương tự. và lý do chính là tôi có cùng một bộ điều khiển ở hai Khu vực khác nhau. một khi tôi loại bỏ một trong số họ làm việc tốt.

tôi có nó sẽ giúp ích cho bạn

Giải pháp dự án


0

Tôi có hai Project trong một Solution với cùng tên điều khiển. Tôi đã xóa tham chiếu dự án thứ hai trong dự án đầu tiên và vấn đề được giải quyết


0

Tôi đã tìm thấy lỗi này có thể xảy ra với trang web ASP.NET truyền thống khi bạn tạo Trình điều khiển trong thư mục không App_Code (đôi khi Visual Studio ngăn chặn điều này).

Nó đặt loại tệp thành "Biên dịch" trong khi bất kỳ mã nào được thêm vào "App_Code" được đặt thành "Nội dung". Nếu bạn sao chép hoặc di chuyển tệp vào App_Code thì nó vẫn được đặt là "Biên dịch".

Tôi nghi ngờ nó có liên quan đến hoạt động của Dự án trang web vì các dự án trang web không có bất kỳ hoạt động xây dựng nào. Việc xóa thư mục bin và thay đổi thành "Nội dung" dường như đã khắc phục nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.