微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – 主机名中没有尾部斜杠,HttpResponse.RemoveOutputCacheItem不起作用

在这里有点腌菜.

我有一个输出相当静态的操作,直到另一个操作用于更新第一个操作的数据源.我使用HttpResponse.RemoveOutputCacheItem删除该操作的缓存输出,以便下次用户加载时刷新它.

基本上我有这样的动作:

[OutputCache(Duration=86400,Location=OutputCacheLocation.Server)]
public ActionResult Index()
{
    return ...
}

在我的HomeController上,另一个控制器上的另一个动作更新了前者使用的信息:

public ActionResult SaveMenu(int id,Menu menu)
{
    ...
    HttpResponse.RemoveOutputCacheItem(Url.Action("Index","Home"));
    ...
}

疯狂的是,只要您要么加载URL http:// site /或http:// site / Home / Index,这就行了.当您使用URL http:// site时,它永远不会刷新.

这是为什么?

解决方法

它与OutputCacheAttribute的工作方式有关,特别是它对RouteData的依赖性不为null.相关部分是:

public override void OnResultExecuting(ResultExecutingContext filterContext)
{
    if (filterContext == null)
    {
        throw new ArgumentNullException("filterContext");
    }
    if (!filterContext.IsChildAction)
    {
        new OutputCachedPage(this._cacheSettings).ProcessRequest(HttpContext.Current);
    }
 }

ResultExecutingContext filterContext派生自ControllerContext.这是ControllerContext.IsChildAction的源代码

public virtual bool IsChildAction
{
    get
    {
        RouteData routeData = this.RouteData;
        if (routeData == null)
        {
            return false;
        }
        return routeData.DataTokens.ContainsKey("ParentActionViewContext");
    }
}

那么,为什么这与您的问题相关?

因为当你省略“/”时,你的路线与任何东西都不匹配.认路由为“/”.这篇文章更深入地解释了这一点:http://www.58bits.com/blog/2008/09/29/ASPNet-MVC-And-Routing-Defaultaspx.aspx.编写它是为了解释为什么在ASP.NET MVC 1项目中必须使用Default.aspx文件,但原因是根植于同一个地方.

因此,基本上,RouteData为null,因此OutputCacheAttribute无法工作.您可以通过执行Michael Jasper建议并利用URL重写来解决您的问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐