Pergunta

Esta não pode ser a maneira correta de usar os controladores, mas eu notei este problema e não tinha descoberto uma maneira de corrigi-lo.

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        

}

Eu tenho notado que o em um controlador de HttpContext não é o "real" HttpContext que você encontraria em System.Web.HttpContext.Current.

Existe alguma maneira para preencher manualmente o HttpContextBase em um controlador? Ou uma melhor maneira de criar uma instância de um controlador?

Foi útil?

Solução

Controllers não são projetados para ser criado manualmente como você está fazendo. Parece que o que você realmente deve fazer é colocar qualquer lógica reutilizável que você tem em uma classe auxiliar vez.

Outras dicas

Por enquanto eu vou fazer o seguinte. Esta parece ser uma correção aceitável ...

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

Quando isso é adicionado a uma classe Controller Estes controladores estão herdando.

Eu não tenho certeza se o HttpContext sendo nula é o comportamento desejado, mas isso vai corrigi-lo, entretanto para mim.

O HttpContext, na ControllerContext é nulo porque ele não está definido quando o controlador é criado. O contructor do controlador não atribuir esta propriedade, por isso vai ser nulo. Normalmente, o HttpContext está definido para o HttpContext da classe ControllerBuilder. Controladores são criadas pela classe ControllerBuilder, seguido pelo DefaultControllerFactory. Quando você quiser criar o seu próprio exemplo de um controlador, você pode usar o ExecuteMethod do controlador com seu próprio ControllerContext. Você não quer fazer isso é uma aplicação real. Quando você começa um pouco mais de experiência com o quadro que você vai encontrar o método adequado para fazer o que quer. Quando você precisa ControllerContext no teste de unidade, você pode usar um quadro zombando zombar do ControllerContext ou você pode classe fingindo.

Você pode encontrar um modelo do fluxo de solicitação no asp.net MVC em este blog .

Quando seu novo para Asp.net MVC, vale a pena o esforço para baixar o código fonte e ler um rastreamento de rota como um pedido é processado.

Será que você deseja utilizar algumas funcionalidades do controlador? Ou ter o controlador executar uma ação?

Se for o primeiro, talvez isso é um código que devem ser separados em outra classe. Se ele é o último, você pode fazer isso simplesmente ter que controlador de fazer uma ação específica:


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

Você está usando uma fábrica de controlador? Se assim for, como é que você registrar componentes?

Eu corri para este problema onde eu tinha inadvertidamente adicionou uma dependência baseada em HttpContext como um Singleton, ao invés de Transient em Windsor.

HttpContext foi nula para todos, mas o primeiro pedido. Levei um tempo para rastrear esse.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top