Подтвердить что ты не робот

HttpContext для экземпляров контроллеров имеет значение null в ASP.net MVC

Возможно, это не правильный способ использования контроллеров, но я заметил эту проблему и не понял способ ее исправления.

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        

}

Я заметил, что HttpContext на контроллере не является "фактическим" HttpContext, который вы найдете в System.Web.HttpContext.Current.

Есть ли способ вручную заполнить HttpContextBase на контроллере? Или лучший способ создать экземпляр контроллера?

4b9b3361

Ответ 1

Контроллеры не предназначены для создания вручную, как вы делаете. Похоже на то, что вы действительно должны делать, вместо того, чтобы помещать любую повторно используемую логику в класс-помощник.

Ответ 2

Пока я собираюсь сделать следующее. Это кажется приемлемым решением...

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

Если это добавлено к классу Controller, эти контроллеры наследуют от.

Я не уверен, что HttpContext, являющийся нулевым, является желаемым поведением, но это будет исправлять его тем временем для меня.

Ответ 3

HttpContext в ControllerContext имеет значение null, поскольку он не установлен при создании контроллера. Контрактор контроллера не присваивает это свойство, поэтому он будет равен нулю. Обычно HttpContext устанавливается в HttpContext класса ControllerBuilder. Контроллеры создаются классом ControllerBuilder, а затем DefaultControllerFactory. Когда вы хотите создать свой собственный экземпляр контроллера, вы можете использовать ExecuteMethod контроллера с вашим собственным ControllerContext. Вы не хотите, чтобы это было настоящим приложением. Когда вы получите больше опыта работы с каркасом, вы найдете подходящий метод, который захотите. Когда вам нужен ControllerContext в Unit test, вы можете использовать фальшивую фреймворк, чтобы издеваться над ControllerContext, или вы можете его подделывать.

Вы можете найти модель потока запросов в asp.net mvc на этом блоге.

Когда вы новичок в Asp.net mvc, стоит попробовать загрузить исходный код и прочитать трассировку маршрута обработки запроса.

Ответ 4

Это то, что вы хотите использовать некоторые функции контроллера? Или контроллер выполняет действие?

Если это первый, возможно, какой-то код, который следует разделить на другой класс. Если это последнее, вы можете сделать это просто, чтобы этот контроллер выполнял определенное действие:


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

Ответ 5

Используете ли вы контроллер factory? Если да, то как вы регистрируете компоненты?

Я столкнулся с этой проблемой, когда я случайно добавил зависимость на основе HttpContext как Singleton, а не Transient в Windsor.

HttpContext имеет значение null для всех, кроме первого запроса. Мне потребовалось некоторое время, чтобы отследить этот.