Max*_*ich 5 c# asp.net asp.net-mvc sass libsass
我的应用程序中有一个样式表~/Content/theme/style.css.它在我的应用程序中使用标准捆绑引用:
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/font-awesome/font-awesome.css",
"~/Content/theme/style.css"));
Run Code Online (Sandbox Code Playgroud)
现在,我使用Sass编译器(Libsass)允许我根据需要将输出style.css文件更改为自定义用户输出文件.
所以基本上我做这样的事情.
CompilationResult compileResult = SassCompiler.CompileFile(Server.MapPath(Path.Combine(WebConfigSettings.RootSassPath, "style.scss"), options: new CompilationOptions {
SourceMap = true,
SourceMapFileUrls = true
});
Run Code Online (Sandbox Code Playgroud)
然后我像这样保存.
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);
Run Code Online (Sandbox Code Playgroud)
但是间歇性地我收到以下可怕的访问错误:"进程无法访问文件C:....\style.css",因为它正被另一个进程使用."(注意:这发生在该File.WriteAllText行)
这没有意义,因为我没有打开任何流到文件并执行我认为是单个原子操作使用File.WriteAllText.
现在我也注意到,当我使用两个不同的浏览器连续修改这个文件时,这个错误特别可能.
我的假设是发生了两件事之一.
或者:
一个.捆绑打包程序以某种方式锁定文件,因为它在更新捆绑包时没有释放锁定或已修改
湾 因为两个不同的连接以某种方式访问文件,所以它们会持续存在.
那么,有没有人碰到类似的东西?关于我如何能够解决这个问题的任何建议?
PS:我尝试使用HttpRuntime.UnloadAppDomain();hacky方式尝试释放文件上的任何锁,但这似乎没有帮助.
当提供文件时,您的网络服务器本身将获得文件的读锁定。因此,如果您要同时写入文件,冲突将是不可避免的。
在重试循环中写入磁盘并忽略此异常。这些文件可能会在很短的时间内可供写入。
通过自己从缓存中提供文件来避免 Web 服务器锁定文件。
从这个答案:
...如果您经常更新这些[文件],那么您实际上是在破坏 IIS 的缓存机制。对于 Web 服务器来说,提供不断变化的文件是不健康的。Web 服务器非常适合提供静态文件。
现在,如果您的[文件]如此动态,也许您需要通过服务器端程序来提供它。
由于您在评论中提到您的最终用户正在更改文件,我建议执行以下操作以确保不会发生锁定冲突:
请参阅如何将 ASP.NET MVC 控制器操作的结果添加到捆绑包?有关如何通过操作方法提供捆绑包的一些潜在解决方案。我可能会使用与此类似的解决方案(尽管缓存策略可能需要不同)。
或者,您可以在每次用户请求中缓存为空时重新加载缓存,并在“保存”操作期间更新文件和缓存,这可能会更简单,并将文件锁定问题的可能性减少到零,但不会t 规模也是如此。
| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |