HttpContext на экземплярах контроллеров нулевой в ASP.net MVC - PullRequest
26 голосов
/ 22 октября 2008

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

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 на контроллере? Или лучший способ создать экземпляр контроллера?

Ответы [ 5 ]

61 голосов
/ 22 октября 2008

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

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

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

Я не уверен, является ли HttpContext равным нулю желаемым поведением, но это пока исправит для меня.

24 голосов
/ 22 октября 2008

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

5 голосов
/ 22 октября 2008

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

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

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

0 голосов
/ 22 октября 2008

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

Я столкнулся с этой проблемой, когда непреднамеренно добавил зависимость на основе HttpContext как синглтон, а не как переходный процесс в Виндзоре.

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

0 голосов
/ 22 октября 2008

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

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


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

...