29

这可能不是使用控制器的正确方法,但我确实注意到了这个问题并且没有想出纠正它的方法。

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 不是您在 System.Web.HttpContext.Current 中找到的“实际”HttpContext。

有没有办法在控制器上手动填充 HttpContextBase?还是创建控制器实例的更好方法?

4

5 回答 5

63

现在我要做以下事情。这似乎是一个可以接受的修复...

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

这被添加到这些控制器继承自的控制器类中。

我不确定 HttpContext 为 null 是否是所需的行为,但这会同时为我修复它。

于 2008-10-22T14:13:51.110 回答
24

Controllers are not designed to be created manually like you're doing. It sounds like what you really should be doing is putting whatever reusable logic you have into a helper class instead.

于 2008-10-22T14:19:29.227 回答
5

ControllerContext 中的 HttpContext 为 null,因为在创建控制器时未设置它。控制器的构造器没有分配这个属性,所以它将为空。通常,HttpContext 设置为 ControllerBuilder 类的 HttpContext。控制器由 ControllerBuilder 类创建,然后是 DefaultControllerFactory。当您想创建自己的控制器实例时,可以将控制器的 ExecuteMethod 与您自己的 ControllerContext 一起使用。你不想这样做是一个真正的应用程序。当您对框架有更多经验时,您会找到合适的方法来做您想要的。当您在单元测试中需要 ControllerContext 时,您可以使用模拟框架来模拟 ControllerContext 或者您可以对它进行类伪造。

您可以在此博客上找到 asp.net mvc 中的请求流模型。

当您刚接触 Asp.net mvc 时,值得努力下载源代码并阅读跟踪请求是如何处理的路由。

于 2008-10-21T22:44:28.740 回答
0

您是否想使用控制器中的某些功能?或者让控制器执行一个动作?

如果是前者,也许那是一些应该被拆分成另一个类的代码。如果是后者,您可以这样做以简单地让该控制器执行特定操作:


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

于 2008-10-21T20:17:08.567 回答
0

您使用的是控制器工厂吗?如果是这样,您如何注册组件?

我遇到了这个问题,我无意中将基于 HttpContext 的依赖项添加为 Singleton,而不是 Windsor 中的 Transient。

除第一个请求外,其他所有请求的 HttpContext 均为空。我花了一段时间才找到那个。

于 2008-10-22T13:50:14.557 回答