2009-05-29 9 views
10

sto ancora cercando di capire le cose con StructureMap e una delle questioni che sto funzionando in è la mia classe Controller fabbrica saltare in aria quando un tipo di controller nulla viene passato ad esso. Ciò accade solo quando l'applicazione viene creata per la prima volta, dopodiché ogni build successiva funziona correttamente. Anche quando spengo Visual Studio e riapro il progetto (non sto eseguendo questo in IIS). È quasi come se ci fosse una sorta di caching in corso. Ecco come si presenta la classe controller:StructureMap fabbrica controller e istanza di controllo nullo in MVC

public class IocControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     try 
     { 
      return (Controller)ObjectFactory.GetInstance(controllerType); 
     } 
     catch (StructureMapException) 
     { 
      System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
      throw; 
     } 
    } 
} 

Cosa potrebbe essere che non va? Devo avere registrato ogni controller? Grazie.

+0

cosa intendi con un controller Null passato? – David

+0

Intendo un riferimento null del tipo di controller passato a GetControllerInstance(). Quello che non capisco è da dove viene quel riferimento nullo. Immagino che il framework MVC stia passando un'istanza del controller nulla? Inizialmente pensavo che avesse qualcosa a che fare con StructureMap, ma non sembra il caso. Immagino di poter inserire un valore nullo nel metodo, ma preferirei capire perché sta facendo quello che sta facendo. La cosa più strana è che accade dopo aver aperto il progetto e averlo creato per la prima volta in Visual Studio dopo il riavvio. Funziona ogni volta dopo. –

+0

Sto correndo nello stesso problema ESATTAMENTE. Qualcuno ha ancora una soluzione? –

risposta

5

Mi sono imbattuto nello stesso problema con una fabbrica di controller costruita attorno a ninject.

Sembra MVC si passerà null per controllertype quando non può risolvere un percorso dalla tabella di routing o quando una route specifica un controller nessuno esistente. Ho fatto due cose per risolvere questo. Si potrebbe voler controllare la tabella di percorso e aggiungere un itinerario catchall che mostra una pagina di errore 404, come descritto qui .Net MVC Routing Catchall not working

Si potrebbe anche verificare con il debugger di routing che cosa va storto. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

+7

Un'altra soluzione, quando si estende una fabbrica di controller esistente: controllare se controllerType è nullo, in tal caso lasciare che la factory esistente gestisca la richiesta invece di gestirla autonomamente. –

1

stavo avendo il problema simile. Credo che sia stato le richieste HTTP per le immagini inesistenti, file CSS, ecc

Sappiamo che il percorso MVC sembra prima di vedere se il file richiesto esiste fisicamente. In caso contrario, l'URL viene testato rispetto alle Route configurate. Penso che la richiesta di un'immagine che non esiste fisicamente sia stata passata al motore di routing e che non corrispondesse a nessun percorso, quindi è stato utilizzato NULL.

Quindi per risolvere il problema, utilizzare FireBug o qualcosa da guardare per, e fissare, le richieste HTTP rotti. Durante lo sviluppo, ho usato un percorso come questo per ignorare temporaneamente questi problemi (tutte le mie cartelle delle risorse Iniziamo con una sottolineatura come _immagini, _Styles, ecc):

routes.IgnoreRoute("_*"); // TODO: Remove before launch 

Spero che questo aiuti!

8

La maggior parte dei browser cerca un favicon.ico quando si carica un sito, e probabilmente c'è qualche caching coinvolto in questo comportamento, questo potrebbe spiegare la strana cosa "Only fail on the first build" che hai menzionato.

Nel mio caso ciò causava il problema del tipo di controller nulla nella fabbrica del controllore.

Aggiunta di un routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); nel global.asax fa l'errore di andare via, la richiesta deve cadere fino al filesystem senza MVC alla ricerca di un controller favico.ico nel codice.

Ecco un link per Gunnar Peipman post about this

ho scoperto sovrascrivendo GetControllerType (stringa NomeControllore) nella mia classe di fabbrica di controllo personalizzato e controllare quale sia il valore NomeControllore era per ogni richiesta.

+0

Hai dato la risposta giusta per il problema;) Grazie! – Rookian

+0

Grazie !! Ha funzionato per me. –

0

Quello che penso che dovete fare è esattamente la stessa cosa che l'MVC fabbrica controller di default fa sul metodo GetControllerInstance. Se si guarda il codice sorgente Microsoft per DefaultControllerFactory a http://aspnetwebstack.codeplex.com/, si vedrà che DefaultControllerFactory genera un'eccezione 404 quando controllerType è null.Ecco come lo facciamo sulla base di queste informazioni:

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
     { 
      if (controllerType == null) 
       return base.GetControllerInstance(requestContext, controllerType); 
      var controller = ObjectFactory.GetInstance(controllerType); 
      return (IController)controller; 
     } 
} 

Fondamentalmente questo farà in modo che, quando l'utente immette un percorso non valida l'applicazione gestisce come un errore 404.

+0

potresti fornire ulteriori dettagli per favore? Sto avendo lo stesso problema e la soluzione di cui sopra non funziona per me (viene lanciata una HttpException e io sono ritornato al debugger). Hai scavalcato altri metodi nella tua fabbrica di controller? Hai fornito costruttori? Come l'hai registrato su Global.asax? Anche se il mio controller personalizzato factory ** ** richiama l'implementazione di base, ottengo ancora l'errore. –

+0

L'ho capito. Ho semplicemente decorato 'GetControllerInstance' con' DebuggerNonUserCodeAttribute' e tutto funziona ora. –

Problemi correlati