我正在处理一个应用程序,其中多个用户在处理期间更新xsl。此文件放在部署了Web应用程序的服务器上的文件夹中。
以下代码用于更新xsl文件。
XmlDocument doc = new XmlDocument();
doc.Load(ConfigurationManager.AppSettings["XSLPdfDimensions"]);
XmlNode root = doc.DocumentElement;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
root.SelectSingleNode(marginTop, nsmgr).Attributes["select"].Value = Convert.ToString(top);
root.SelectSingleNode(marginBottom, nsmgr).Attributes["select"].Value = Convert.ToString(bottom);
doc.Save(ConfigurationManager.AppSettings["XSLPdfDimensions"]);
当用户在发生异常后同时访问此文件时
"The process cannot access the file 'C:\XSL\Dimensions.xsl'because it is being used by another process"
如何通过最小的功能延迟解决此问题,或者有一些替代方法来更新xsl文件?
答案 0 :(得分:2)
还是有一些替代方法来更新xsl文件?
为什么不通过代码作为参数传入marginTop和marginBottom。这样你就有了一个XSL,不需要修改,所有用户都能得到他们想要的东西。
或修改XML以传递这些值并重写XSL以使用XML中的这些值。在精心设计的系统中,没有理由用户修改XSL。传递给转换的XML或参数可以处理该变量信息。
由于我发现您正在尝试传递PDF维度,因此您应该在http://www.cloudformatter.com/CSS2Pdf.APIDoc.Usage处查看代码。如果您查看该代码,您可以访问该转换后面的XSL。所有适当的页面维度 - 页面大小,所有边距和许多,更多的东西都从XML传递到XSL(从HTML div派生和/或在Javascript中指定并附加到发送到XSL的XML) )。
没有人需要编辑XSL以获取各种内容 - 页面大小,边距,背景图像,页面边框,页面背景颜色等。
答案 1 :(得分:1)
当两个或多个用户尝试调用doc.Save
方法时,我猜您会看到此错误。当一个用户开始写入文件时,操作系统会锁定它以防止其他用户同时更改。您可能需要在lock中使用它 - 它们确保只有一个线程会在同一时刻尝试写入它。
另一个选择是重新设计您的应用程序以避免同时写入文件系统 - 这是一个风险很大的业务,完全是因为并发问题。