gpt4 book ai didi

asp.net-mvc-3 - ASP.NET MVC3 获取 View 任何部分的最后修改时间?

转载 作者:行者123 更新时间:2023-12-02 09:07:11 25 4
gpt4 key购买 nike

我想在渲染之前获取 View 任何部分的最后修改时间。这包括布局页面、部分 View 等。

我想设定一个合适的时间

 Response.Cache.SetLastModified(viewLastWriteUtcTime);   

正确处理http缓存。目前我已经对 View 本身进行了这项工作,但是如果布局页面或子部分 View 中有任何更改,这些更改不会被

var viewLastWriteUtcTime = System.IO.File.GetLastWriteTime(
Server.MapPath(
(ViewEngines.Engines.FindView(ControllerContext, ViewBag.HttpMethod, null)
.View as BuildManagerCompiledView)
.ViewPath)).ToUniversalTime();

有什么方法可以获得总体的上次修改时间吗?

在部署修改 View 的相关部分后,我不想响应 304 Not Modified,因为用户会得到不一致的行为。

最佳答案

我不保证这是最有效的方法,但我已经测试过它并且它有效。您可能需要调整 GetRequestKey() 逻辑,并且可能需要根据您的场景选择备用临时存储位置。我没有对文件时间实现任何缓存,因为这似乎是您不感兴趣的东西。如果时间可以稍微偏离并且您想避免每个请求的文件访问开销。

首先,使用一个 View 引擎扩展 RazorViewEngine,该引擎可跟踪在此请求期间呈现的所有 View 的最大上次修改时间。我们通过在 session 中存储以 session ID 和请求时间戳为键的最新时间来实现此目的。您可以使用任何其他 View 引擎轻松地完成此操作。

public class CacheFriendlyRazorViewEngine : RazorViewEngine
{
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
UpdateLatestTime(controllerContext, GetLastModifiedForPath(controllerContext, viewPath));
var pathToMaster = masterPath;
if (string.IsNullOrEmpty(pathToMaster))
{
pathToMaster = "~/Views/Shared/_Layout.cshtml"; // TODO: derive from _ViewStart.cshtml
}
UpdateLatestTime(controllerContext, GetLastModifiedForPath(controllerContext, pathToMaster));
return base.CreateView(controllerContext, viewPath, masterPath);
}

protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
UpdateLatestTime(controllerContext, GetLastModifiedForPath(controllerContext, partialPath));
return base.CreatePartialView(controllerContext, partialPath);
}

private DateTime GetLastModifiedForPath(ControllerContext controllerContext, string path)
{
return System.IO.File.GetLastWriteTime(controllerContext.HttpContext.Server.MapPath(path)).ToUniversalTime();
}

public static void ClearLatestTime(ControllerContext controllerContext)
{
var key = GetRequestKey(controllerContext.HttpContext);
controllerContext.HttpContext.Session.Remove(key);
}

public static DateTime GetLatestTime(ControllerContext controllerContext, bool clear = false)
{
var key = GetRequestKey(controllerContext.HttpContext);
var timestamp = GetLatestTime(controllerContext, key);
if (clear)
{
ClearLatestTime(controllerContext);
}
return timestamp;
}

private static DateTime GetLatestTime(ControllerContext controllerContext, string key)
{
return controllerContext.HttpContext.Session[key] as DateTime? ?? DateTime.MinValue;
}

private void UpdateLatestTime(ControllerContext controllerContext, DateTime timestamp)
{
var key = GetRequestKey(controllerContext.HttpContext);
var currentTimeStamp = GetLatestTime(controllerContext, key);
if (timestamp > currentTimeStamp)
{
controllerContext.HttpContext.Session[key] = timestamp;
}
}

private static string GetRequestKey(HttpContextBase context)
{
return string.Format("{0}-{1}", context.Session.SessionID, context.Timestamp);
}
}

接下来,将 global.asax.cs 中的现有引擎替换为新引擎

protected void Application_Start()
{
System.Web.Mvc.ViewEngines.Engines.Clear();
System.Web.Mvc.ViewEngines.Engines.Add(new ViewEngines.CacheFriendlyRazorViewEngine());
...
}

最后,在某些全局过滤器中或在每个 Controller 的基础上添加 OnResultExecuted。请注意,我相信 Controller 中的 OnResultExecuted 在发送响应后运行,因此我认为您必须使用过滤器。我的测试表明这是真的。

另请注意,在使用该值后,我将从 session 中清除该值,以防止时间戳污染 session 。您可能希望将其保留在缓存中并设置一个较短的过期时间,这样您就不必显式清除内容,或者如果您的 session 未保留在内存中,以避免将其存储在 session 中的事务成本。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class UpdateLastModifiedFromViewsAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var cache = filterContext.HttpContext.Response.Cache;
cache.SetLastModified(CacheFriendlyRazorViewEngine.GetLatestTime(filterContext.Controller.ControllerContext, true));
}

}

最后,将过滤器应用到您想要使用它或作为全局过滤器的 Controller :

[UpdateLastModifiedFromViews]
public class HomeController : Controller
{
...
}

关于asp.net-mvc-3 - ASP.NET MVC3 获取 View 任何部分的最后修改时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11016677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com