【问题标题】:HttpContext is null in abstract classHttpContext 在抽象类中为空
【发布时间】:2015-02-12 20:52:43
【问题描述】:

我正在尝试在已经编写好的抽象类中设置会话。我想做的是; 首先,我尝试检查方法类型是 get 还是 post。如果是 GET 方法,则设置会话。

代码如下:

public abstract class BaseAbstractController : Controller
{
    public BaseAbstractController()
    {
        if (this.HttpContext.Request.HttpMethod.ToString() == "GET")
        {
            this.HttpContext.Session["testsession"] = this.HttpContext.Request.Url.AbsolutePath;
        }
    }
}

我面临的问题是,我收到 Null 异常错误,这是因为 HTTPContext 值为 null。

目前只有一个从抽象控制器扩展而来的 MVC 控制器。

【问题讨论】:

  • 何时何地调用?
  • 没有调用这个方法。另一个控制器只是从它扩展而来。
  • 是的,该控制器的构造函数将其称为基本构造函数。但是该控制器何时初始化以及从何处初始化?话虽如此,我对MVC并不熟悉。但显然在这一点上没有当前的HttpContextHttpContext.Request。使用调试器,在构造函数的第一行设置断点。
  • 我的猜测是,MVC 或某些依赖注入器正在这样做。可能我需要重写执行/初始化函数以使 httpcontext 工作?

标签: c# asp.net-mvc


【解决方案1】:

最好不要在构造函数中这样做,因为构造函数应该只在可能的情况下构造实例。您可以改写OnActionExecuting

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    var req = filterContext.RequestContext.HttpContext.Request;
    if (req.HttpMethod == "GET")
    {
        filterContext.RequestContext.HttpContext.Session["testsession"] = req.Url;
    }
}

【讨论】:

    【解决方案2】:

    您的问题是,您引用的 Controller 中的 HttpContext 属性在控制器被实例化之后才设置 - 这意味着它在您的抽象类的构造函数中不可用。

    如果您需要访问HttpContext 对象,那么最好的办法是直接引用静态实例,如下所示:System.Web.HttpContext

    public abstract class BaseAbstractController : Controller
    {
        public BaseAbstractController()
        {
            if (System.Web.HttpContext.Current.Request.HttpMethod.ToString() == "GET")
            {
                System.Web.HttpContext.Current.Session["testsession"] = System.Web.HttpContext.Current.Request.Url.AbsolutePath;
            }
        }
    }
    

    更新:

    要回复您的评论,如果您尝试访问 OnActionExecuted 中的 HttpContext,那么您应该通过 ActionExecutedContext 参数中的请求上下文访问它,如下所示:

    protected virtual void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var context = filterContext.HttpContext;
    }
    

    不同之处在于,此时控制器已经实例化,并且基本控制器的HttpContext 属性已经设置。最终,所有 .NET MVC 框架所做的都是从 Controller.HttpContext 引用 System.Web.HttpContext 静态实例。

    【讨论】:

    • 感谢您的代码。但是,如果我在抽象控制器中覆盖 Execute 或其他一些函数,例如 CONTROLLER 的 OnActionExecuted,然后使用 HTTPcontext 和会话设置呢?
    • 太棒了!很高兴我能帮上忙。
    • HttpContext.Current在OWIN自托管中不可用,最好避免使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多