Ответ 1
Контроллеры не предназначены для создания вручную, как вы делаете. Похоже на то, что вы действительно должны делать, вместо того, чтобы помещать любую повторно используемую логику в класс-помощник.
Возможно, это не правильный способ использования контроллеров, но я заметил эту проблему и не понял способ ее исправления.
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, являющийся нулевым, является желаемым поведением, но это будет исправлять его тем временем для меня.
HttpContext в ControllerContext имеет значение null, поскольку он не установлен при создании контроллера. Контрактор контроллера не присваивает это свойство, поэтому он будет равен нулю. Обычно HttpContext устанавливается в HttpContext класса ControllerBuilder. Контроллеры создаются классом ControllerBuilder, а затем DefaultControllerFactory. Когда вы хотите создать свой собственный экземпляр контроллера, вы можете использовать ExecuteMethod контроллера с вашим собственным ControllerContext. Вы не хотите, чтобы это было настоящим приложением. Когда вы получите больше опыта работы с каркасом, вы найдете подходящий метод, который захотите. Когда вам нужен ControllerContext в Unit test, вы можете использовать фальшивую фреймворк, чтобы издеваться над ControllerContext, или вы можете его подделывать.
Вы можете найти модель потока запросов в asp.net mvc на этом блоге.
Когда вы новичок в Asp.net mvc, стоит попробовать загрузить исходный код и прочитать трассировку маршрута обработки запроса.
Это то, что вы хотите использовать некоторые функции контроллера? Или контроллер выполняет действие?
Если это первый, возможно, какой-то код, который следует разделить на другой класс. Если это последнее, вы можете сделать это просто, чтобы этот контроллер выполнял определенное действие:
return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });
Используете ли вы контроллер factory? Если да, то как вы регистрируете компоненты?
Я столкнулся с этой проблемой, когда я случайно добавил зависимость на основе HttpContext как Singleton, а не Transient в Windsor.
HttpContext имеет значение null для всех, кроме первого запроса. Мне потребовалось некоторое время, чтобы отследить этот.