'Ev' adlı denetleyiciye uyan birden çok tür bulundu


318

Şu anda çevrimiçi olarak barındırılan iki alakasız MVC3 projem var.

Biri iyi çalışıyor, diğeri çalışmıyor, bana hata veriyor:

'Home' adlı denetleyiciyle eşleşen birden çok tür bulundu. Bu isteğe hizmet veren rota ('{controller} / {action} / {id}'), istekle eşleşen bir denetleyiciyi aramak için ad alanları belirtmezse oluşabilir.

Bu durumda, 'ad alanları' parametresi alan 'MapRoute' yönteminin aşırı yüklenmesini çağırarak bu yolu kaydedin.

Barındırıcımın çalışma şekli bana FTP erişimi sağlaması ve bu klasörde her bir uygulama için bir tane olmak üzere iki klasör daha var.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com iyi çalışıyor, yerel dosya sistemime benim uygulama yayınlamak sonra içeriği FTP ve çalışır.

Bar.com'u yükleyip çalıştırmaya çalıştığımda yukarıdaki sorun tetikleniyor ve sitemi kullanmamı engelliyor. Foo.com hala çalışırken .

Bar.com ftpFolderA2 içinde HER YERDEN denetleyicilerden mi arama yapıyor ve bu yüzden başka bir tane HomeControllermi buluyor ? Yalnızca Denetleyici klasörüne olması gerektiği gibi görünmesini nasıl söyleyebilirim?

Gerçekler:

  1. Alan kullanmamak. Bunlar TAMAMEN ilgisiz iki projedir. Yayınlanan her projeyi ilgili klasörlere yerleştiriyorum. Hiçbir şey fantezi.
  2. Her projede sadece 1 adet HomeController bulunur.

Birisi sorunun bu olduğunu onaylayabilir mi?


Çok belirsiz bir soru. Alanları mı kullanıyorsunuz? Sorun yerel olarak mı oluşuyor?
Darin Dimitrov

1
@Darin: Bu bilgiyi düzenledi.
Sadece Bolivya Burada

Yanıtlar:


473

Bu hata iletisi genellikle alanları kullandığınızda oluşur ve alan ve kök içinde aynı denetleyici adına sahip olursunuz . Örneğin ikisine sahipsiniz:

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

Bu sorunu çözmek için (hata mesajının size önerdiği gibi), rotalarınızı bildirirken ad alanlarını kullanabilirsiniz. Yani ana rota tanımında Global.asax:

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

ve sizin ~/Areas/Admin/AdminAreaRegistration.cs:

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

Alanları kullanmıyorsanız, her iki uygulamanız da aynı ASP.NET uygulamasında barındırılıyor ve farklı ad alanlarında aynı denetleyicilere sahip olduğunuz için çakışmalar oluşuyor gibi görünüyor. Bu tür çakışmalardan kaçınmak istiyorsanız IIS'yi bu ikisini ayrı ASP.NET uygulamaları olarak barındıracak şekilde yapılandırmanız gerekir. Sunucuya erişiminiz yoksa barındırma sağlayıcınızdan bunu isteyin.


Ben hiç alan kullanmıyorum. Bunlar, bir FTP kök klasörünün içindeki ayrı bir klasörde bulunan tamamen ilgisiz iki uygulamadır. Belki de uygulamam her yerde MVC denetleyicilerini arıyor ve bu erişim diğer Ev Denetleyicisine kadar uzanıyor. Hiçbir yere bakmamasını nasıl söyleyebilirim ama kendi Denetleyici klasörü ve geri kalanını göz ardı edebilirim?
Sadece Bolivya Burada

2
@SergioTapia, görünüşe göre uygulamalarınızla oldukça ilgili. Barındırma sağlayıcınız bunları aynı ASP.NET uygulamasının içine koydu. Onları IIS'de ayrı örnekler olarak bölmesini istemeniz veya çok fazla sorununuz olması gerekir.
Darin Dimitrov

13
Teşekkürler. ASP MVC 4.0'da ad alanları gibi adlandırılmış bir argüman iletmeniz gerekir: new [] {"AppName.Areas.Admin.Controllers"}
om471987

1
+1 - İyi çalışıyor. Bölgede rota kaydı için ayrı bir alan olduğunu fark etmedim. Baktığım her yerde Darin'den kaliteli bir cevap var gibi görünüyor :)
Travis J

1
Eğer alanları kullanan ve denetleyicileri ad alanı istiyorsanız, ad alanı için gereken her iki alan içinde yolları ve dışarıdan. Sadece alan rotasını adlandırmak hala bu sorunu bana verdi.
Gavin Ward

528

İşte bu hatayla karşılaşabileceğiniz başka bir senaryo. Projenizi derlemenin dosya adı değişecek şekilde yeniden adlandırırsanız, ASP.NET derlemenizin bu hatayı yeniden oluşturacak iki sürümüne sahip olmanız mümkündür.

Çözüm binklasörünüze gitmek ve eski dll silmek için. ("Projeyi Yeniden Oluştur" u denedim, ancak bu onları silmedi, bu yüzden binbunların kaybolduğundan emin olun )


1
Bu hatanın diğer varyasyonu, yeniden paylaşmayı ve ad alanı adı değiştirmeyi içeren bazı "otomatik" yeniden düzenleme seçeneklerini kullanmanızdır. Bana olan buydu.
Sebastian 506563

5
Bunu bir Azure Uygulama Hizmetinden alıyorsanız, oturum açmak ve dosyaları silmek için https: // <your_app_name_here> .scm.azurewebsites.net / DebugConsole adresine gidin.
Tom Blodget

5
Teşekkürler benim için sorun buydu. Mevcut bir projeyi yeni bir klasöre kopyalayıp yapıştırarak "yeni" bir proje oluşturmuştum; eski yapı dlls ile geldi, bin klasör silme temiz sildi
brando

Proje dosyalarımı ikinci bir sürücüye taşırken bunu anladım. Bin klasörünü temizlemek klasörü çözer. En garip şey.
Roberto Bonini

Bu çok basit bir düzeltme ile acı verici bir hataydı. Teşekkürler!
Troy Grosfield

63

MVC4 ve MVC5'te Biraz farklıdır, aşağıdakileri kullanın

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

ve Alanlarda

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

39

Bunu izle ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Sonra bu resim (umarım çizimlerimi beğenirsiniz)

resim açıklamasını buraya girin


Sorun çözüldü ..! :)
Aruna

1
@ppumkin bunu kör bir programcıya söyle. Metin ekran okuyucular tarafından okunabilir
Carlos Muñoz

Merhaba Carlos. Evet durumu anlıyorum. Görünürlük engelsiz insanları açıklamak zaten zor. Herhangi bir yardımcı yazılımın resimde ne olup bittiğini herhangi bir vücuda iyi açıklayabileceğinden bile emin değilim. Cevabın muhtemelen en azından neler olup bittiğini açıklamaya çalışırken metne sahip olması gerektiğine dikkat çekiyor.
Piotr Kula

32

Başkalarının
söyledikleri doğru ama yine de aynı problemle karşılaşanlar için: Benim durumumda başka bir projeyi kopyaladığım için n başka bir şeye yeniden adlandırdım çünkü AMAbin klasördeki önceki çıktı dosyaları hala vardı ... Ve ne yazık ki, Build -> Clean Solutionyeniden adlandırdıktan sonra vurmak proje ve onları Namespaces kaldırmaz ... bu yüzden onları elle silmek sorunumu çözdü!


2
önerin beni kurtardı
Abhimanyu

1
ben de, teşekkürler, temiz dosnt aslında temiz, grrrr demek
katibaer

1
Thank you @ DrTJ Bu soooooo sinir bozucu oldu! Tehlikeli temiz sürecinin çalışmasını beklersiniz ve beklentiler başarısızlığın köküdür. Bu saçımı daha da çekerek kurtardı beni!
Mike

28

proje bin/klasörünüzde

yalnızca PROJECT_PACKAGENAME.DLL dosyanızın olduğundan emin olun

ve ANOTHER_PROJECT_PACKAGENAME.DLL dosyasını kaldırın

burada yanlışlıkla görünebilir veya projenizi yeniden adlandırırsınız


2
Kesinlikle benim sorunum. Teşekkür ederim.
Detilium

Benim için çalıştı! thnks!
eyal

Meclis adını değiştirmiştim ve depoda bazı eski dll'ler vardı. Thanks
apc

Teşekkür ederim! Çok basit bir şeyi özlediğime inanamıyorum.
Vash

25

HomeController sınıfıyla çakışmış olabilecek başka bir dll dosyası varsa bin klasörünü kontrol edin .


7
Bir projeyi kopyalarken ve yeniden adlandırırken bu bit beni ... dll adlı eski proje hala çöp kutusunun içindeydi, bir temizleme kaldırmadı ... El ile silmek zorunda kaldım!
Paul Zahra

2
Benim için sorun buydu. Bir meslektaşım yanlışlıkla bu sorunu yaratan bir ön uç projeden diğerine bir referans ekledi. Başvuruyu kaldırır, böylece Visual Studio da diskindeki dll dosyalarını kaldırır. Git'ten güncellemeyi aldım, referanslar gitmişti, ancak dll dosyaları temiz kaldı. Çünkü VS'm referansı artık görmedi. Ancak IIS çalışırken dosyaları gördü ve kullandı. Onları diskimden kaldırmak yardımcı oldu.
Yeronimo

14

Başka bir çözüm, ControllerBuilder'a varsayılan bir ad alanı kaydetmektir. Ana uygulamamızda çok sayıda rota ve bölgelerimizde sadece tek bir genel rota (zaten bir ad alanı belirlediğimiz) olduğundan, bunu en kolay çözüm olarak bulduk:

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

Benim için durum buydu. Gerçekten aynı ada sahip birden fazla denetleyiciniz varsa, rota tanımlarınıza ad alanları ekledikten sonra buna ihtiyaç duyulabilir. Örneğin, denetleyici ve alanın yol tarafından açıkça seçilmediği ana sayfanız için.
Jason Beck

Üzerinde çalıştığım projede, müşteriye özel çalışma alanlarına sahip bir anahtar teslimi ofisimiz var. Her birinin bir 'ayarlar' denetleyicisi vardır. Bu yanıt, her alan için ayar denetleyicisi için bir rota tanımlamak zorunda kalmanın harika bir alternatifidir.
Derreck Dean

7

Alanları kullanmasanız bile, RouteMap'inizde hangi ad alanının kullanılacağını belirtebilirsiniz

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

Ancak asıl sorun, iki uygulamanızın IIS'de kurulum şekli gibi görünüyor


7

Sadece bu sorunu yaşadım, ancak sadece web sitemde yayınladığımda, yerel hata ayıklamamda iyi çalıştı. FTP'yi webhost'umdan kullanmam ve yayınlama dizinime gitmem ve BIN klasöründeki dosyaları silmem gerektiğine karar verdim.


Bu benim için bir çözümdü. Yayınlama profilim yerel olarak mevcut olmayan dosyaları kaldırmadı, bu yüzden uygulamam yenilerine ek olarak eski dll'leri aldı ve yinelenen türler buldu.
Form

1
Proje adımı değiştirdim ve tüm dosyaları refractored ama sonra bu hatayı aldım. Bin klasörünü silmek de benim için çalıştı.
Mauro Valvano

6

Başka durum da olabilir Alanları sizsiniz, (küresel yönlendirme tablosunda Namespaces vermek gibi) Alanlarda yönlendirme tüm adımları izledikten sonra hala:

Global Denetleyicilerinizi, yönlendirmede sağladığınız 'ad alanına' kaydırmamış olabilirsiniz.

Örneğin:

Bitir bunu:

public class HomeController : Controller
{

Onun yerine:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

Evet MapRoute'ta sadece bir ad alanı sağlamak yeterli değildir. Burada sağlanan ad alanı, denetleyici sınıfının ad alanı ile eşleşmelidir. Şimdi çalışıyor!
DanKodi

6

ApiController içeren kendi derlemenizi DefaultAssembliesResolver öğesinin GetAssemblies'ini geçersiz kılarak ve zaten base.GetAssemblies () dizisinde varsa, 500 hatasını da alabilirsiniz.

Konuşma konusu olan mesele:

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

yukarıdaki kod Denetleyicinizle aynı derlemedeyse, bu derleme listede iki kez olacak ve Web API'sının hangisini kullanacağını bilmediği için 500 hatası oluşturacaktır.


6

otomatik olarak çözümlemek istiyorsanız .. uygulamayı açıkça aşağıdaki kodu ekleyerek kullanabilirsiniz:

 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
birden fazla projede aynı kontrolörlere sahipseniz mükemmel çözüm
Ravi Anand

4

Aynı sorun var ve hiçbir şey yardımcı olmadı. Sorun aslında hiç yinelenen yok, bu hata proje ad alanı MyCuteProjectiçin değiştirdikten sonra görünür MyCuteProject.Web.

Sonunda, hata kaynağının -codebehind global.asaxdeğil bir dosya - XML ​​işaretlemesi olduğunu .csfark ettim. İçindeki ad alanını kontrol edin - bu bana yardımcı oldu.


2

Ben sadece 'Bin' klasörünü sunucudan sildim ve binimi sunucuya kopyaladım ve sorunum çözüldü.


2

Route.config içinde

ad alanları: new [] {"Appname.Controllers"}


1

Yapımızda bir uyarı olarak ortaya çıkan bir çakışma olduğunda bu hatayı aldık.

Visual Studio -> Araçlar -> Seçenekler -> Projeler ve Çözümler -> Oluştur ve Çalıştır -> MSBuild proje derlemesi çıktı ayrıntı düzeyini Ayrıntılı olarak artırıncaya kadar ayrıntı alamadık.

Projemiz bir .net v4 web uygulamasıdır ve System.Net.Http (v2.0.0.0) ile System.Net.Http (v4.0.0.0) arasında bir çakışma vardı. Projemiz, bir paketten (nuget kullanılarak dahil) dosyanın v2 sürümüne başvurdu. Başvuruyu kaldırdığımızda ve v4 sürümüne bir başvuru eklediğimizde derleme çalıştı (uyarılar olmadan) ve hata düzeltildi.


1

Bu hatanın diğer varyasyonu, yeniden paylaşmayı ve ad alanı adı değiştirmeyi içeren bazı "otomatik" yeniden düzenleme seçeneklerini kullanmanızdır. Bana olan bu. Bu tür senaryo ile ilgili sorunu çözmek için klasör silmebin


Bu, 1 projenin içeriğine başka bir projenin içeriğine kopyaladığımda başıma geldi. Bin klasöründen belirli dosyaları silmek zorunda kaldım
Adriaan Davel

1

Projeyi sağ tıklayın ve projeyi temizle'yi seçin. Ya da bin dizinini tamamen boşaltın ve ardından yeniden oluşturun. Bu, önceki derlemelerdeki kalan montajları temizlemelidir


1

Tek bir uygulamada bir süre bu Sorun da geliyor Bu durumda, uygulamanızı yayınlarken bu onay kutusunu seçin resim açıklamasını buraya girin


1

Başka yardımcı olabilir, ben de bu hatayla karşılaştım. Sorun bana web sitesinde yanlış başvuru neden oldu. Bilinmeyen bir nedenle web sitem aynı çözümde başka bir web sitesine yönlendiriyordu. Ve bu kötü referansı kaldırdığımda, her şey düzgün çalışmaya başladı.


0

Episerver veya başka bir MVC tabanlı CMS'de çalışıyorsanız, söz konusu denetleyici adının zaten talep edildiğini görebilirsiniz.

Bu, denilen bir denetleyici oluşturmaya çalışırken başıma geldi FileUpload.


0

benzer bir sorunla karşı karşıya kaldım. ve ana nedeni ben iki farklı alanda aynı denetleyiciye sahip oldu. bir kez onun iyi çalışıyor birini kaldırmak.

Sana yardımcı olacak.

Proje Çözümü


0

Aynı Denetleyici Adı ile bir Çözümde iki Projem var. İlk Projede İkinci Proje Referansını Kaldırdım ve Sorun Çözüldü


0

Bu hata geleneksel ASP.NET Web sitesi ile olmayan App_Code dizininde denetleyici oluşturduğunuzda (bazen Visual Studio bunu önler) oluşabilir bulduk.

Dosya türünü "Derle" olarak ayarlarken "App_Code" öğesine eklenen tüm kodlar "İçerik" olarak ayarlanır. Dosyayı App_Code'a kopyalar veya taşırsanız, yine de "Derle" olarak ayarlanır.

Web sitesi projelerinde herhangi bir derleme işlemi olmadığından Web Sitesi Projesi işlemi ile ilgili bir şey olduğundan şüpheleniyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.