不可捕获的IOException

时间:2012-10-29 12:10:22

标签: c# asp.net .net

ASPX.NET应用程序,它使用XDocument.Load()从XML文件中读取。有时它会抛出一个IOException静态,无法打开文件b / c它正被另一个进程使用。我无法通过打开文件并重新加载网站来重新创建此项。但更奇怪的是,异常发生在Try-Catch块中,我明确地捕获了System.IOException。

这是堆栈:

  

异常类型:IOException

     

主题信息:       主题ID:18       线程帐户名称:NT AUTHORITY \ NETWORK SERVICE       冒充:假       堆栈跟踪:在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)      at System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions options,SECURITY_ATTRIBUTES secAttrs,String msgPath,Boolean bFromProxy,Boolean useLongPath)      在System.IO.FileStream..ctor(字符串路径,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize)      在System.Xml.XmlDownloadManager.GetStream(Uri uri,ICredentials凭据,IWebProxy代理,RequestCachePolicy cachePolicy)      在System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri,String role,Type ofObjectToReturn)      在System.Xml.XmlReaderSettings.CreateReader(String inputUri,XmlParserContext inputContext)      在System.Xml.XmlReader.Create(String inputUri,XmlReaderSettings设置,XmlParserContext inputContext)      在System.Xml.Linq.XDocument.Load(String uri,LoadOptions选项)      在System.Xml.Linq.XDocument.Load(String uri)

     删除路径\ StatTick \ Controls \ ChartSlider.ascx.cs中的StatTick.Controls.ChartSlider.getXMLFile(String url)中的

:第27行      at StatTick.Controls.ChartSlider.Page_Load(Object sender,EventArgs e)in removedpath \ StatTick \ Controls \ ChartSlider.ascx.cs:第21行

以下是代码:

private XDocument getXMLFile(string url)
    {
        XDocument tempDoc;

        t("Looking For XML File");
        int tryCount = 0;
        //string URL = "~/tempCharts/imageList.xml";
        while (tryCount++ < 10)
        {

            try
            {
                tempDoc = XDocument.Load(Server.MapPath(url));
                return tempDoc;
            }
            catch (IOException)
            {
                t("Error accessing XML File, sleeping for 10ms and then trying again\r\nTryCount: " + tryCount.ToString());
                Thread.Sleep(10);
                continue;

            }
        }

        return null;
    }

希望有人能够为我提供一些有关此问题的见解。

由于

修改 好的,我已经完成了,我将不得不做一些测试来验证它不再抛出感谢您的快速回复!:

while (tryCount <= 10)
        {
            try
            {
                using (FileStream fStream = new FileStream(Server.MapPath(url), FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    XDocument xDoc = XDocument.Load(fStream);

                    foreach (XElement xe in xDoc.Descendants("ImageUrl"))
                    {
                        t("Added: " + xe.Value);
                        tempImageUrlList.Add(xe.Value);
                    }
                    t("Done with Image List!");
                }
                return tempImageUrlList;
            }
            catch (Exception)
            {
                t("Error access XML File, sleeping for 10ms and then trying again\r\nTryCount: " + tryCount.ToString());
                Thread.Sleep(10);
                continue;
            }
        }

2 个答案:

答案 0 :(得分:1)

使用流代替并使用它加载XML。您可以确保使用using语句关闭基础流。

using (Stream s = File.OpenRead(Server.MapPath(url)))
{
        XDocument.Load(s);
}

或者

using (FileStream fs= new FileStream(Server.MapPath(url), FileMode.Open,
                                          FileAccess.Read, FileShare.Read))
{
        XDocument.Load(fs);
}

答案 1 :(得分:0)

我认为错误是因为文件的访问权限,所以请给予文件读/写权限,然后尝试读取文件。