这可能不是使用控制器的正确方法,但我确实注意到了这个问题并且没有找到解决问题的方法。
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
}
我注意到Controller上的HttpContext不是你在System.Web.HttpContext.Current中找到的“实际”HttpContext。
有没有办法在Controller上手动填充HttpContextBase?或者是创建Controller实例的更好方法?
答案 0 :(得分:61)
现在我要做以下事情。这似乎是一个可以接受的解决办法......
public new HttpContextBase HttpContext {
get {
HttpContextWrapper context =
new HttpContextWrapper(System.Web.HttpContext.Current);
return (HttpContextBase)context;
}
}
如果将其添加到Controller类,则这些控制器将继承自。
我不确定HttpContext是否为null是所需的行为,但这会在此期间解决它。
答案 1 :(得分:24)
控制器并非设计为像您一样手动创建。听起来你应该做的就是把你所拥有的任何可重用的逻辑放入一个帮助类中。
答案 2 :(得分:5)
ControllerContext中的HttpContext为null,因为在创建控制器时未设置它。控制器的构造函数不分配此属性,因此它将为null。通常,HttpContext设置为ControllerBuilder类的HttpContext。控制器由ControllerBuilder类创建,后跟DefaultControllerFactory。如果要创建自己的控制器实例,可以将控制器的ExecuteMethod与自己的ControllerContext一起使用。你不想这样做是一个真正的应用程序。当您获得更多使用框架的经验时,您将找到适合您想要的方法。当您在单元测试中需要ControllerContext时,您可以使用模拟框架来模拟ControllerContext,或者您可以伪造它。
您可以在this blog上的asp.net mvc中找到请求流的模型。
当您是Asp.net mvc的新手时,下载源代码并读取跟踪请求的处理方式是值得的。
答案 3 :(得分:0)
您是否想要使用控制器中的某些功能?或让控制器执行操作?
如果是前者,也许这是一些应该拆分成另一个类的代码。如果是后者,您可以执行此操作以简单地让控制器执行特定操作:
return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });
答案 4 :(得分:0)
您使用的是控制器工厂吗?如果是这样,您如何注册组件?
我遇到了这个问题,我无意中将一个基于HttpContext的依赖项添加为Singleton,而不是Windsor中的Transient。
除第一个请求外,HttpContext为null。我花了一段时间来追踪那一个。