在我的基本控制器的构造函数中,我调用的是一种扩展方法,用于检查客户端上的特定cookie。
目前我正在使用System.Web.HttpContext.Current来获取当前上下文。
但是,我认为我应该使用Controller.HttpContext,因为它更易于测试并包含有关请求的其他信息。
但是,Controller.HttpContext在创建时返回null(相信这是设计),还在Initialize和Execute方法上返回null(除非我使用Routing.RequestContext.HttpContext?)。
所以,如果我应该使用Controller.HttpContext而不是HttpContext.Current,请求在什么时候可以使用?
由于 本
答案 0 :(得分:5)
当您在控制器中调用操作方法时,可以获取Controller.HttpContext。这意味着您可以在操作方法
中访问它如果你想在每个请求上检查一下你可以使用自定义属性,请看这个例子:
public class LoggingFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Trace.Write("(Logging Filter)Action Executing: " +
filterContext.ActionDescriptor.ActionName);
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Exception != null)
filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");
base.OnActionExecuted(filterContext);
}
}
我建议您阅读自定义属性。但是你说更可测试的是什么意思?您可以使用像rhino mocks或google moq
这样的模拟框架轻松模拟您的httpcontext答案 1 :(得分:1)
如果您关心可测试性,我会用接口结束对HttpContext的访问并解析它/将其注入您的控制器。
public class CookieValidator : ICookieValidator
{
private HttpContext _Context;
public HttpContext Context
{
get
{
if(_Context == null)
{
_Context = HttpContext.Current;
}
return _Context;
}
set // set a mock here when unit testing
{
_Context = value;
}
}
public bool HasValidCookies()
{
_Context... // do your logic here
}
}