【发布时间】:2017-09-19 10:22:58
【问题描述】:
我的应用程序~/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 执行我认为是单个原子操作的操作。
现在我也注意到,当我使用两个不同的浏览器连续修改这个文件时,这个错误特别容易发生。
我的假设是两种情况之一正在发生。
要么:
a.捆绑打包程序以某种方式锁定文件,因为它在更新捆绑包时已被修改并且没有释放锁定或
b.因为两个不同的连接以某种方式访问文件,所以锁定在它们之间持续存在。
那么,有没有人遇到过类似的事情?有关如何解决此问题的任何建议?
PS:我曾尝试使用 HttpRuntime.UnloadAppDomain(); 作为一种破解方法来尝试释放文件上的任何锁定,但这似乎没有帮助。
【问题讨论】:
-
您的编译器在写入文件时会出现错误。对吗?
-
不,抱歉,如果我不清楚,错误发生在 System.IO.File.WriteAllText 行。我不使用 SassCompiler 来编写实际文件。
-
有必要写
style.css文件吗?您可以在调用时编译 sass 并将其注入包中 -
如果您使用 Visual Studio 构建 MVC,有大量工具、扩展和插件可帮助您将 SASS 和 LESS 文件自动转换为 CSS 文件。 Web Essentials 就是其中之一。如果你喜欢 Bundle 东西在一个地方,你可以试试 BundleTransformer Nuget 包。
-
是的,当然,我理解这一点并且我使用这些工具,但我的特定用例需要最终用户能够在运行时修改 Sass 文件。
标签: c# asp.net asp.net-mvc sass libsass