Asp.net mvc 有关HttpContext、HttpContextBase和操作筛选器的问题

Asp.net mvc 有关HttpContext、HttpContextBase和操作筛选器的问题,asp.net-mvc,asp.net-mvc-3,httpcontext,action-filter,Asp.net Mvc,Asp.net Mvc 3,Httpcontext,Action Filter,我试图在一个静态类上构建一个静态属性,该类基本上会返回一个cookie值,以便在我的MVC站点(MVC 3,如果有必要的话)中使用。大概是这样的: public static class SharedData { public static string SomeValue { get { if (HttpContext.Current.Request.Cookies["SomeValue"] == null)

我试图在一个静态类上构建一个静态属性,该类基本上会返回一个cookie值,以便在我的MVC站点(MVC 3,如果有必要的话)中使用。大概是这样的:

public static class SharedData
{
    public static string SomeValue
    {
        get
        {
            if (HttpContext.Current.Request.Cookies["SomeValue"] == null)
            {
                CreateNewSomeValue();
            }

            return HttpContext.Current.Request.Cookies["SomeValue"].Value.ToString();
        }
    }
}
我需要从控制器动作、global.asax方法和动作过滤器中访问此项。但问题是,当操作过滤器运行时,HttpContext不可用。现在,我必须有一个单独的静态方法来从我传入的过滤器上下文中提取cookie,这看起来很尴尬

构建这样一个静态方法来从控制器动作和动作过滤器中检索这样一个cookie值的最佳解决方案是什么?还是有更好的方法来做这样的事情


提前感谢。

调用静态的
HttpContext。当前的
设计不好。相反,创建一个扩展方法,从
HttpContext
HttpContextBase
的实例访问cookie

我给你写了一个小助手。您可以使用它在操作筛选器中执行功能

public static class CookieHelper
{
    private const string SomeValue = "SomeValue";
    public static string get_SomeValue(this HttpContextBase httpContext)
    {
        if(httpContext.Request.Cookies[SomeValue]==null)
        {
            string value = CreateNewSomeValue();
            httpContext.set_SomeValue(value);
            return value;
        }
        return httpContext.Request.Cookies[SomeValue].Value;
    }
    public static void set_SomeValue(this HttpContextBase httpContext, string value)
    {
        var someValueCookie = new HttpCookie(SomeValue, value);
        if (httpContext.Request.Cookies.AllKeys.Contains(SR.session))
        {
            httpContext.Response.Cookies.Set(someValueCookie);
        }
        else
        {
            httpContext.Response.Cookies.Add(someValueCookie);
        }
    }   
}

注意:只需将
HttpContext
参数替换为
HttpContext
,就可以轻松地使这些方法在
HttpContext
上工作

正如JohnnyO在上面指出的,我一直都可以从我的动作过滤器中访问HttpContext。至少,在特定的操作过滤器方法中需要这样做。可能有其他一些过滤器/方法在某一点上没有访问权限,但现在,它正在按照我的需要工作。

感谢您的回复。不过有几个问题。从我所读到的,如果你想让你的MVC应用程序易于测试,你需要尽可能从HttpContext中删除依赖项。在应用程序中乱扔对HttpContext或filterContext.HttpContext的引用,这不是更糟吗?而且,仅仅因为HttpContext不是从HttpContextBase派生的(这就是filterContext.HttpContext),就必须有两个方法来做完全相同的事情似乎很愚蠢。我也在努力避免这种情况。再次感谢。(1)要使您的应用程序可测试,请删除对
HttpContext
的引用<另一方面,code>HttpContextBase
是完全可测试的。即使该属性被称为
HttpContext
,它也会返回一个
HttpContextBase
对象。(2) 是的,有两种方法做完全相同的事情是愚蠢的。哪两种方法做完全相同的事情?如果您打算在
HttpContext
HttpContextBase
上创建扩展方法,那么我并不是建议您这样做,只是让您知道您可以以及如何做到。另外,您可能需要使用依赖于
HttpContext
而不是
HttpContextBase
的应用程序,而您只需
新建HttpContextWrapper(context).get_SomeValue()
,就可以了,如果在
HttpContext
instance.HttpContext.Current上有一个扩展方法,那么在运行操作筛选器时应该可以使用,这样会更有效。你犯了什么错误?哇,你说得对。我不知道为什么我认为不是。也许它不是为了一个不同的动作过滤器,或者是在“已执行”而不是“正在执行”上?我不知道,但我可以发誓在我做这个的时候它是空的。谢谢