我有一个Web服务应用程序,它使用另一个保存和加载xml文件的应用程序。
三次访问文件后,无法再次访问该文件。如果我杀死属于NETWORK SERVICE用户的w3wp.exe进程,一切都会重新开始工作但是一次。
以下是保存和加载xml文件的代码示例。
public void saveXmlFile(string filename)
{
if (vsqlschema == null)
{
Console.WriteLine("Tried export data without schema");
//TODO: Messagebox
return;
}
FileStream fs = null;
try
{
XmlSerializer serializer = new XmlSerializer(typeof(vsqlSchema));
fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
serializer.Serialize(fs, vsqlschema);
}
catch (Exception e)
{
Console.WriteLine("IO Error: {0}", e.Message);
//TODO: Messagebox
}
finally
{
if (fs != null)
{
fs.Close();
fs.Dispose();
}
}
}
public XmlDocument loadXml(string filename)
{
//XmlReaderSettings xrs = new XmlReaderSettings();
//xrs.XmlResolver = null;
//xrs.DtdProcessing = DtdProcessing.Ignore;
XmlDocument xdoc = new XmlDocument();
try
{
//using (StringReader sr = new StringReader(filename))
//using (XmlReader reader = XmlReader.Create(sr, xrs))
using (XmlTextReader reader = new XmlTextReader(filename)){
xdoc.Load(reader);
reader.Close();
}
}
catch (XmlException xe)
{
errors.Add(string.Format("Line: {0}, Position: {1}::: {2}", xe.LineNumber, xe.LinePosition, xe.Message));
}
return xdoc;
}
任何想法发生了什么以及可以解决这个问题
答案 0 :(得分:1)
似乎存在访问该文件的竞争条件。您应该锁定文件以进行写入,并允许其他人在阅读时修改它。
要实现这一点,您还需要对FileStream类构造函数进行细粒度控制,为每个案例指定rigth参数,以便在使用System.IO.FileShare枚举值读取时允许或不修改文件。
http://msdn.microsoft.com/en-us/library/cssfs8c4.aspx
http://msdn.microsoft.com/en-us/library/5h0z48dh.aspx
我不知道是否完全有必要,但我也想在Close()之前调用Stream.Flush()