1

XDocument.Load()を使用してXMLファイルから読み取るASPX.NETアプリケーション。別のプロセスで使用されているファイルを開くことができないという静的なIOExceptionがスローされることがあります。ファイルを開いてサイトをリロードしても、これを自由に再現することはできません。しかし、さらに奇妙なのは、System.IOExceptionを明示的にキャッチしているTry-Catchブロック内から例外が発生することです。

スタックは次のとおりです。

例外タイプ:IOException

スレッド情報:スレッドID:18スレッドアカウント名:NT AUTHORITY \ NETWORK SERVICE偽装:Falseスタックトレース:System.IO .__ Error.WinIOError(Int32 errorCode、String mayFullPath)at System.IO.FileStream.Init(String path、 FileModeモード、FileAccessアクセス、Int32権限、ブールuseRights、FileShare共有、Int32 bufferSize、FileOptionsオプション、SECURITY_ATTRIBUTES secAttrs、String msgPath、ブールbFromProxy、ブールuseLongPath)at System.IO.FileStream..ctor(文字列パス、FileModeモード、FileAccessアクセス、FileShare共有、Int32 bufferSize)at System.Xml.XmlDownloadManager.GetStream(Uri uri、ICredentialscredentials、IWebProxy proxy、RequestCachePolicy cachePolicy)at System.Xml.XmlUrlResolver.GetEntity(Uri AbsoluteUri、String role、Type ofObjectToReturn)atSystem。 Xml。XmlReaderSettings.CreateReader(String inputUri、XmlParserContext inputContext)at System.Xml.XmlReader.Create(String inputUri、XmlReaderSettings settings、XmlParserContext inputContext)at System.Xml.Linq.XDocument.Load(String uri、LoadOptions options)atSystem.Xml。 Linq.XDocument.Load(String uri)

StatTick.Controls.ChartSlider.getXMLFile(String url)のremoveedpath \ StatTick \ Controls \ ChartSlider.ascx.cs:line 27のStatTick.Controls.ChartSlider.Page_Load(Object sender、EventArgs e)の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;
    }

うまくいけば、誰かが私のためにこの問題への洞察を提供することができるでしょう。

ありがとう

編集 OKこれが私がやったことです。もうスローされないことを確認するためにいくつかのテストを行う必要があります。迅速な対応に感謝します!:

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;
            }
        }
4

2 に答える 2

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);
}

;

于 2012-10-29T12:33:51.073 に答える
0

ファイルのアクセス権の問題だと思いますので、ファイルに読み書き権限を与えてから読み込んでみてください。

于 2012-10-29T12:19:24.873 に答える