2009-05-29 32 views
10

Todavía estoy tratando de resolver las cosas con StructureMap y uno de los problemas con los que me estoy tropezando es con la clase de mi Controller Factory explotando cuando se le pasa un tipo de controlador nulo. Esto solo ocurre cuando la aplicación se compila por primera vez, después de lo cual cada compilación subsiguiente funciona bien. Incluso cuando apago Visual Studio y vuelvo a abrir el proyecto (no estoy ejecutando esto en IIS). Es casi como si hubiera algún tipo de almacenamiento en caché. Así es como se ve la clase de controlador:Controlador StructureMap instancia de controlador y controlador nulo en 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; 
     } 
    } 
} 

¿Qué podría estar mal? ¿Debo tener todos los controladores registrados? Gracias.

+0

¿qué quiere decir con un controlador nulo que se le pasó? – David

+0

Me refiero a una referencia nula del tipo de controlador que se pasa a GetControllerInstance(). Lo que no entiendo es de dónde viene esa referencia nula. Supongo que el marco MVC está pasando una instancia de controlador nulo? Inicialmente pensé que tenía algo que ver con StructureMap, pero no se parece al caso. Supongo que puedo poner un cheque para un nulo en el método, pero preferiría descubrir por qué está haciendo lo que está haciendo. Lo más extraño es que ocurre después de abrir el proyecto y compilarlo por primera vez en Visual Studio después de reiniciar. Funciona cada vez después de eso. –

+0

Me encuentro con el mismo problema. Alguien tiene una solución para esto todavía? –

Respuesta

5

Me encontré con el mismo problema con una fábrica de controladores construida alrededor de ninject.

Parece que MVC le pasará nulo por el tipo de control cuando no puede resolver una ruta desde la tabla de enrutamiento o cuando una ruta especifica un controlador que no existe. Hice dos cosas para resolver esto. Es posible que desee comprobar su tabla de rutas y agregar una ruta catchall que muestra una página de error 404 como se describe aquí .Net MVC Routing Catchall not working

También puede consultar con el depurador de enrutamiento lo que va mal. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

+7

Otra solución, al ampliar una fábrica de controlador existente: compruebe si controllerType es nulo; si es así, deje que la fábrica existente maneje la solicitud en lugar de manejarla usted mismo. –

1

Estaba teniendo el problema similar. Creo que fueron las solicitudes HTTP de imágenes inexistentes, archivos CSS, etc.

Sabemos que el enrutamiento MVC primero busca ver si el archivo solicitado existe físicamente. Si no lo hace, la URL se prueba contra las Rutas configuradas. Creo que la solicitud de una imagen que no existía físicamente se pasó al motor de enrutamiento y no coincidía con ninguna ruta, por lo que se utilizó NULL.

Para solucionarlo, utilice FireBug o algo para mirar y solucionar las solicitudes HTTP rotas. Durante el desarrollo, he usado una ruta como esta para evitar temporalmente estos temas (todos mis carpetas de recursos a empezar con un guión bajo como _Imágenes, _Styles, etc):

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

espero que esto ayude!

8

La mayoría de los navegadores están buscando un favicon.ico cuando carga un sitio, y es probable que haya algo de almacenamiento en caché relacionado con este comportamiento, esto podría explicar la rara cosa "Solo falla en la primera compilación" que mencionó.

En mi caso, esto causaba el problema del tipo de controlador nulo en la fábrica del controlador.

Agregar un routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); en global.asax hace desaparecer el error, la solicitud debe pasar al sistema de archivos sin MVC buscando un controlador favico.ico en su código.

Aquí hay un enlace a Gunnar Peipman post about this

descubrí anulando GetControllerType (controllerName cadena) en mi clase de fábrica controlador personalizado y comprobar cuál es el valor controllerName era para cada solicitud.

+0

Has dado la respuesta correcta para el problema;) ¡Gracias! – Rookian

+0

¡Gracias! Funcionó para mí –

0

Lo que creo que debes hacer es exactamente lo mismo que hace la fábrica de controladores MVC predeterminada en el método GetControllerInstance. Si nos fijamos en el código fuente de Microsoft para DefaultControllerFactory en http://aspnetwebstack.codeplex.com/, verá que DefaultControllerFactory arroja una excepción 404 cuando controllerType es nulo.Aquí es cómo lo hacemos en base a esta información:

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

Básicamente esto se asegurará de que, cuando el usuario entra en una ruta no válida la aplicación maneja como un error 404.

+0

¿podría proporcionarnos más detalles, por favor? Estoy teniendo el mismo problema y la solución anterior no funciona para mí (se lanza una HttpException y me devuelven al depurador). ¿Has anulado cualquier otro método en tu fábrica de controladores? ¿Has proporcionado constructores? ¿Cómo lo ha registrado en Global.asax? Incluso si mi fábrica de controladores personalizados ** solo ** llama a la implementación base, sigo recibiendo el error. –

+0

Lo descubrí. Simplemente decoré 'GetControllerInstance' con' DebuggerNonUserCodeAttribute' y todo funciona ahora. –

Cuestiones relacionadas