w3wp.exe(NETWORK SERVICE用户)阻止访问文件

时间:2013-04-22 19:23:48

标签: .net iis w3wp

我有一个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;
    }

任何想法发生了什么以及可以解决这个问题

1 个答案:

答案 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()