HttpContext на экземплярах контроллеров нулевой в ASP.net MVC

StackOverflow https://stackoverflow.com/questions/223317

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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


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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top