Domanda

Questo potrebbe non essere il modo corretto di usare i controller, ma ho notato questo problema e non avevo trovato un modo per correggerlo.

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        

}

Ho notato che HttpContext su un controller non è il "reale" HttpContext che potresti trovare in System.Web.HttpContext.Current.

Esiste un modo per popolare manualmente HttpContextBase su un controller? O un modo migliore per creare un'istanza di un controller?

È stato utile?

Soluzione

I controller non sono progettati per essere creati manualmente come stai facendo. Sembra che quello che dovresti davvero fare è mettere qualsiasi logica riutilizzabile che hai in una classe di supporto.

Altri suggerimenti

Per ora ho intenzione di fare quanto segue. Questa sembra essere una soluzione accettabile ...

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

Dove questo viene aggiunto a una classe Controller da cui questi controller ereditano.

Non sono sicuro se HttpContext essendo null sia il comportamento desiderato, ma questo lo risolverà nel frattempo per me.

HttpContext, in ControllerContext è nullo perché non è impostato al momento della creazione del controller. Il contraente del controller non assegna questa proprietà, quindi sarà nulla. Normalmente, HttpContext è impostato su HttpContext della classe ControllerBuilder. I controller vengono creati dalla classe ControllerBuilder, seguita da DefaultControllerFactory. Quando si desidera creare la propria istanza di un controller, è possibile utilizzare il metodo Execute del controller con il proprio ControllerContext. Non vuoi farlo è una vera applicazione. Quando avrai un po 'più di esperienza con il framework troverai il metodo appropriato per fare ciò che desideri. Quando hai bisogno di ControllerContext in Unit test, puoi usare un framework beffardo per deridere ControllerContext o puoi classificarlo fingendolo.

Puoi trovare un modello del flusso di richieste in asp.net mvc su questo blog .

Quando sei nuovo su Asp.net mvc, vale la pena di scaricare il codice sorgente e leggere una traccia del percorso di elaborazione di una richiesta.

È che si desidera utilizzare alcune funzionalità del controller? O il controller esegue un'azione?

Se è il primo, forse è un po 'di codice che dovrebbe essere suddiviso in un'altra classe. Se è quest'ultimo, puoi farlo semplicemente per fare in modo che quel controller esegua un'azione specifica:


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

Stai usando una fabbrica di controller? In tal caso, come stai registrando i componenti?

Ho riscontrato questo problema in cui avevo inavvertitamente aggiunto una dipendenza basata su HttpContext come Singleton, anziché Transient in Windsor.

HttpContext era nullo per tutti tranne la prima richiesta. Mi ci è voluto un po 'per rintracciarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top