0

私はWebプログラミング(Visual Web DeveloperのC#)に不慣れで、C以外のプログラミングスキルも少し錆びています。

一部のセルがユーザー入力を求めるテーブルを作成しました。入力が行われると、入力がプロンプトに置き換わります。したがって、テーブルに注釈を付けることができるのは、ページに最初にアクセスした人だけです。後で、注釈付きのページを他の人が表示できるようにする必要があるため、最初に実行した後、プロンプトなしでページをロードする必要があります。これを行うために、私はユーザーを識別して、そのユーザーが編集可能なページを取得し、すべての編集がxmlファイルに保存され、別のユーザーがページを実行すると、テーブル設定がxmlファイルから読み戻されるようにします。編集の。

一貫してxmlファイルに書き込むのに問題があります。具体的には、ファイルにアクセスする複数のプロセスを作成することがあるようで、コードがファイルを更新しようとするとランタイム例外がスローされます。

ページの読み込みごとに新しいファイルを作成したくなかったので、静的クラスが最適だと思いました。コードは次のとおりです。

static class XMLReaderWriter
{
    static String fileLocation = "D:\\WebApp\\dashboard.xml";
    static XMLReaderWriter()
    {
        FileStream fs = File.Create(fileLocation);
        if (File.Exists(fileLocation))
        {
            // The opening tag
            writeToFile(fileLocation, "<Dashboard>\n");
        }
        else
        {
            Exception e = new Exception("Failed to create " + fileLocation);
            throw e;
        }
    }
    public static void writeXML(String xml)
    {
        if(File.Exists(fileLocation))
        {
            writeToFile(fileLocation, xml);
        }
        else
        {
            File.Create(fileLocation);
            writeToFile(fileLocation, xml);
        }
    }

    private static void writeToFile(String fileLocation, String xml)
    {
        StreamWriter sw = new StreamWriter(fileLocation, true);
        sw.WriteLine(xml);
        sw.Close();
        sw.Dispose();
    }

    public static string readXML(String trendID)
    {
        StringBuilder result = new StringBuilder("");
        if (File.Exists(fileLocation))
        {
            XDocument xDoc = XDocument.Load(fileLocation);
            var image = from id in xDoc.Descendants(trendID) select new
                        {
                            source = id.Attribute("image").Value
                        };
            foreach (var imageSource in image)
            {
                result.AppendLine(imageSource.source);
            }
        }
        return result.ToString();
    }

    public static void done()
    {
        // The closing tag
        writeToFile(fileLocation, "</Dashboard>");
    }
}

ここで私はメソッドを呼び出しています:

XMLReaderWriter.writeXML("\t<trend id=\"" + trendID +"\">\n\t\t" + innerHTML + "\" />\n\t</trend>");

最後に、xmlファイルに終了タグを追加するための送信ボタンがあります。

<asp:Button runat="server" Text="Submit Changes" OnClick="Submit_Click" />

protected void Submit_Click(Object sender, EventArgs e)
{
    XMLReaderWriter.done();
}

時々、すべてがうまく機能することがあります-私は不正な形式のxmlを生成しているようですが。しかし、ほとんどの場合、xmlファイルにアクセスするプロセスは複数あります。

アドバイスをいただければ幸いです。

よろしく。

4

1 に答える 1

1

Webプログラミングとは、マルチスレッド環境で作業することを意味します。

ブラウザからWebサーバーへの各リクエストは、個別のスレッドです。

そのため、他のリクエスト(スレッドなど)に排他ロックが設定されている可能性があるため、ファイルにアクセスできない場合があります。

もう1つのポイントは、ステートメントを使用することはあなたの友達でなければならないということです。

StreamWriter sw = new StreamWriter(fileLocation, true);
sw.WriteLine(xml);
sw.Close();
sw.Dispose();

... と:

using(StreamWriter sw = new StreamWriter(fileLocation, true))
{
    sw.WriteLine(xml);
}

これはtry-finallyブロックと同等であり、Disposeの任意の実装のメソッドを呼び出しますIDisposable。したがって、ブロックに障害が発生した場合は、常にを呼び出しDispose()ます。

上記のコメントでは、スレッドでの操作中に問題が発生した場合、IISアプリケーションが停止するか、アプリケーションプールがリサイクルされるまで、ファイルへのロックが永久に保持されます。

概要:

  1. あなたの場合、複数のスレッドが同じファイルに書き込もうとしている可能性があります。
  2. エラーが発生すると、影響を受けるファイルにロックが残る可能性があります。

解決策:Webアプリケーションでファイルを操作しないでください。データを保存するためのより良い方法があります:データベース-これらは並行シナリオでの多くの問題を解決します!! -

于 2012-06-12T21:28:28.900 に答える