加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 主机名中没有尾部斜杠,HttpResponse.RemoveOutpu

发布时间:2020-12-16 06:44:58 所属栏目:asp.Net 来源:网络整理
导读:我在这里有点腌菜. 我有一个输出相当静态的操作,直到另一个操作用于更新第一个操作的数据源.我使用HttpResponse.RemoveOutputCacheItem删除该操作的缓存输出,以便下次用户加载时刷新它. 基本上我有这样的动作: [OutputCache(Duration=86400,Location=Output
我在这里有点腌菜.

我有一个输出相当静态的操作,直到另一个操作用于更新第一个操作的数据源.我使用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重写来解决您的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读