Отсутствует косая черта в имени узла - PullRequest
4 голосов
/ 19 февраля 2011

Я здесь немного рассол.

У меня есть действие, для которого выходные данные довольно статичны, пока другое действие не будет использовано для обновления источника данных для первого действия. Я использую 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, он никогда не обновляется.

Почему это?

Ответы [ 3 ]

5 голосов
/ 04 марта 2011

Это связано с тем, как работает OutputCacheAttribute, в частности с его зависимостью от RouteData, не равной нулю.Соответствующая часть:

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");
    }
}

Итак, почему это относится к вашему вопросу?

Потому что, когда вы опускаете "/", ваш Route ничего не соответствует.Маршрут по умолчанию "/".Статья, которая объясняет это более подробно, находится здесь: http://www.58bits.com/blog/2008/09/29/ASPNet-MVC-And-Routing-Defaultaspx.aspx.Он был написан, чтобы объяснить, почему файл Default.aspx был необходим в проектах ASP.NET MVC 1, но причина кроется в том же месте.

Итак, в основном, RouteData имеет значение null, поэтому OutputCacheAttribute не может работать.Вы можете решить свою проблему, выполнив то, что предложил Майкл Джаспер, и воспользовавшись перезаписью URL.

1 голос
/ 27 февраля 2011

В IIS есть очень полезный модуль, который называется URL Rewrite. Одним из вариантов является удаление или добавление косой черты ко всем / конкретным URL-адресам. Если проблема заключается только в конце косой черты, это должно сработать.

0 голосов
/ 19 февраля 2011

Я видел похожее поведение в поведении SharePoint. SharePoint запутался с http://site; он не смог определить, был ли URL-адрес File или SharePoint Site. Вероятно, здесь происходит нечто подобное.

Вы, вероятно, решили проблему, добавив URL с косой чертой; но на тот случай, если у вас нет:

url = string.Format( "{0}/", url.TrimEnd( '/' ) );
...