Question

Cela n’est peut-être pas la bonne façon d’utiliser les contrôleurs, mais j’ai remarqué ce problème et je n’avais pas trouvé le moyen de le corriger.

public JsonResult SomeControllerAction() {

    //The current method has the HttpContext just fine
    bool currentIsNotNull = (this.HttpContext == null); //which is false    

    //creating a new instance of another controller
    SomeOtherController controller = new SomeOtherController();
    bool isNull = (controller.HttpContext == null); // which is true

    //The actual HttpContext is fine in both
    bool notNull = (System.Web.HttpContext.Current == null); // which is false        

}

J'ai remarqué que le HttpContext sur un contrôleur n'est pas le "réel". HttpContext que vous trouverez dans System.Web.HttpContext.Current.

Est-il possible de renseigner manuellement la base HttpContextBase sur un contrôleur? Ou un meilleur moyen de créer une instance de contrôleur?

Était-ce utile?

La solution

Les contrôleurs ne sont pas conçus pour être créés manuellement comme vous le faites. Il semble que ce que vous devriez vraiment faire, c’est de mettre toute la logique réutilisable que vous avez dans une classe d’aide.

Autres conseils

Pour l'instant, je vais faire ce qui suit. Cela semble être un correctif acceptable ...

public new HttpContextBase HttpContext {
    get {
        HttpContextWrapper context = 
            new HttpContextWrapper(System.Web.HttpContext.Current);
        return (HttpContextBase)context;                
    }
}

Là où cela est ajouté à une classe de contrôleurs, ces contrôleurs en héritent.

Je ne sais pas si le comportement souhaité est HttpContext, mais cela résoudra le problème dans l'intervalle.

Le HttpContext dans le ControllerContext est null car il n'est pas défini lors de la création du contrôleur. Le constructeur du contrôleur n'attribue pas cette propriété, elle sera donc nulle. Normalement, HttpContext est défini sur HttpContext de la classe ControllerBuilder. Les contrôleurs sont créés par la classe ControllerBuilder, suivie de la classe DefaultControllerFactory. Lorsque vous souhaitez créer votre propre instance de contrôleur, vous pouvez utiliser la méthode ExecuteMethod du contrôleur avec votre propre ControllerContext. Vous ne voulez pas faire cela est une vraie application. Quand vous aurez plus d'expérience avec le framework, vous trouverez la méthode appropriée pour faire ce que vous voulez. Lorsque vous avez besoin de ControllerContext dans le test unitaire, vous pouvez utiliser un framework moqueur pour simuler ControllerContext ou vous pouvez le simuler.

Vous pouvez trouver un modèle du flux de demandes dans asp.net mvc à ce blog .

Lorsque vous entrez pour la première fois dans Asp.net mvc, il est utile de télécharger le code source et de lire le suivi du chemin traité, ainsi que le traitement d'une demande.

Est-ce que vous souhaitez utiliser certaines fonctionnalités du contrôleur? Ou demandez au contrôleur d'effectuer une action?

Si c’est l’ancien, c’est peut-être un code qui devrait être divisé en une autre classe. Si c'est le dernier cas, vous pouvez le faire simplement en demandant à ce contrôleur d'effectuer une action spécifique:


return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });

Utilisez-vous une usine de contrôleurs? Si oui, comment enregistrez-vous les composants?

J'ai rencontré ce problème où j'avais ajouté par inadvertance une dépendance basée sur HttpContext en tant que Singleton, plutôt que transitoire à Windsor.

HttpContext était null pour toutes les requêtes sauf la première. Il m'a fallu un certain temps pour retrouver celui-là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top