2 votes

Problèmes avec ASP.NET MVC et StructureMap

StructureMap fonctionne bien sur ma machine. Tout fonctionne parfaitement ... jusqu'à ce que je demande une ressource qui n'existe pas. Au lieu d'une erreur 404, j'obtiens une erreur 500.

eg. http://localhost:6969/lkfhklsfhskdfksdf

En consultant le net, on m'a dit de corriger ma classe de contrôleur de carte de structure . J'ai fait cela et j'ai eu la joie d'obtenir le -. Page d'écran jaune 404 par défaut à l'origine -. Ok, c'est mieux que ma page d'erreur 500.

MAIS, je veux qu'il aille sur ma page 404 personnalisée :( Si j'appelle une mauvaise action sur un contrôleur légitime, j'obtiens ma page 404 personnalisée.

Dans mon global.asax, j'ai mes routes personnalisées, puis la route par défaut, et enfin la route 404 :

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Post", action = "Index", id = "" } // Parameter defaults
    );

// Invalid/Unknown route.
routes.MapRoute(
    "404-ResourceNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "ResourceNotFound" }
    );

Voici le code de mon contrôleur de structure :

public class StructureMapControllerFactory: DefaultControllerFactory {
    protected override IController GetControllerInstance(Type controllerType) {
        if (controllerType != null) {
            return ObjectFactory.GetInstance(controllerType) as Controller;
        return base.GetControllerInstance(controllerType);
    }
}

Y a-t-il un moyen de faire en sorte que l'usine de contrôle de la carte de structure soit réintégrée dans le système de gestion de l'information de l'entreprise ? global.asax ou ai-je fait quelque chose de vraiment mal et dois-je réparer d'autres choses ?

Bravo !

2voto

cottsak Points 5490

Mmm... il semble que ce soit un problème d'exception. comme la façon dont MVC est conçu pour gérer les erreurs 404 via des exceptions.

Voici mon code :

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

        return result;
    }
}

vous l'avez peut-être déjà fait et vous l'avez changé. Si ce n'est pas le cas, essayez-le et voyez s'il y a une différence. Je ne pense pas qu'il y en ait.

Essayez peut-être de vous introduire dans cette surcharge et de voir quelles exceptions sont levées.

(A propos : c'est bizarre comme je tombe toujours sur tes questions, Krome. Il n'y a pas d'autre choix que d'aller voir ailleurs )

EDITAR: J'ai essayé la requête garb et j'ai obtenu la même exception. J'ai donc mis à jour ma classe comme vous l'avez fait.

Ma nouvelle classe :

public class StructureMapControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(Type controllerType)
    {
        if (controllerType == null)
            return base.GetControllerInstance(controllerType);

        IController result = null;
        try
        {
            result = ObjectFactory.GetInstance(controllerType) as Controller;
        }
        catch (StructureMapException)
        {
            System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
            throw;
        }

        return result;
    }
}

cela semble me renvoyer les 404 comme il se doit mais je n'obtiens jamais les pages d'erreur personnalisées dans le développement (localement) je dois attendre de publier avant de les obtenir. Avez-vous l'habitude de voir les pages d'erreur personnalisées dans le développement ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X