[英]Overwriting ASP.NET MVC active stylesheet bundle
我的应用程序~/Content/theme/style.css
有一个样式表。 它在我的应用程序中使用标准捆绑引用:
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/font-awesome/font-awesome.css",
"~/Content/theme/style.css"));
现在,我使用Sass编译器(Libsass)允许我根据需要将输出style.css
文件更改为自定义用户输出文件。
所以基本上我做这样的事情。
CompilationResult compileResult = SassCompiler.CompileFile(Server.MapPath(Path.Combine(WebConfigSettings.RootSassPath, "style.scss"), options: new CompilationOptions {
SourceMap = true,
SourceMapFileUrls = true
});
然后我像这样保存。
string outputPath = Server.MapPath(WebConfigSettings.ThemeOutputPath);
if (System.IO.File.Exists(outputPath))
System.IO.File.Copy(outputPath, string.Format("{0}.bak", outputPath), true);
System.IO.File.WriteAllText(Server.MapPath(WebConfigSettings.ThemeOutputPath), compileResult.CompiledContent);
但是间歇性地我收到以下可怕的访问错误: “进程无法访问文件C:.... \\ style.css”,因为它正被另一个进程使用。“ (注意:这发生在File.WriteAllText
行)
这没有意义,因为我没有打开任何流到文件并执行我假设使用File.WriteAllText
的单个原子操作。
现在我也注意到,当我使用两个不同的浏览器连续修改这个文件时,这个错误特别可能。
我的假设是发生了两件事之一。
或者:
一种。 捆绑打包程序以某种方式锁定文件,因为它在更新捆绑包时没有释放锁定或已修改
湾 因为两个不同的连接以某种方式访问文件,所以它们会持续存在。
那么,有没有人碰到类似的东西? 有关如何解决此问题的任何建议?
PS:我尝试过使用HttpRuntime.UnloadAppDomain();
作为一种尝试释放文件锁定的hacky方法,但这似乎并没有帮助。
您的Web服务器本身将在文件服务时获得读锁定。 因此,如果您要同时编写文件,则冲突将不可避免。
在重试循环中写入磁盘并忽略此异常。 这些文件很可能在很短的时间内写入。
避免Web服务器通过从缓存中自己提供文件来锁定文件。
从这个答案 :
...如果你要更新这些[文件],你真的在这里击败了IIS的缓存机制。 Web服务器提供不断变化的文件并不健康。 Web服务器非常适合提供静态文件。
现在,如果你的[文件]是如此动态,也许你需要通过服务器端程序来提供它。
由于您在评论中提到您的最终用户正在更改文件,因此我建议您执行以下操作以确保不存在锁定冲突的可能性:
请参阅如何将ASP.NET MVC控制器操作的结果添加到Bundle? 关于如何从动作方法提供捆绑的一些潜在解决方案。 我可能会使用类似于这个的解决方案(尽管缓存策略可能需要不同)。
或者,您可以在每次用户请求中为空时重新加载缓存,并在“保存”操作期间更新文件和缓存,这可能更简单,并将文件锁定问题的可能性降低到零,但不会也是规模。
当一个页面在浏览器上呈现时,优化器将捆绑的css和jqueries处理为缓存。 因此,一旦页面获得兑现,一个页面重新请求浏览器将首先检查页面缓存内容,如果不存在则只进行服务调用。 只有两种解决方案可以减少您的问题或使用sass类型的css。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.