DOBON.NET DOBON.NETプログラミング掲示板過去ログ

htmlコードの書き出し

環境/言語:[Windows Vista/7 C# VS2005]
分類:[ASP.NET]

WEB アプリで xxxxx.aspx から html のコードを書き出しその後それにリダイレクトして表示させようとしています。

テスト用のコードは、下記です。開発環境では、問題なくリダイレクトしますが、サーバーで行う場合、いくつかのクライアントが同時に同じ処理をした場合(ただし表示内容は異なる)、問題なく動作するのでしょうか?

protected void Button1_Click(object sender, EventArgs e)
{
string[] txt = {
"<html>",
"<head>",
"<title>タイトル</title>",
"</head>",
"<body>",
"本文", <- ここは、処理により毎回異なる
"</body>",
"</html>" };


string path2 = "C:\\inetpub\\wwwroot\\test.html";

//書き込むファイルが既に存在している場合は、上書きする
System.IO.StreamWriter sw = new System.IO.StreamWriter(path2, false, System.Text.Encoding.GetEncoding("shift_jis"));

for(int i =0 ; i < txt.Length ; ++i)
sw.Write(txt[i]);
//閉じる
sw.Close();

Response.Redirect("http://localhost/test.html");
}

なぜこのような書き方をしたいかと言えば、CSS などに画像ファイル名を指定したく、処理ごとにコードが固定できないので、毎回専用に表示コードを作成すればうまくいきそう?
と考えました。

よろしくお願いします。
Response.Writeで書くのは使えませんか?
私も shu さん案に一票投じたいと思います。

■No28306に返信(esuさんの記事)

> いくつかのクライアントが同時に同じ処理をした場合(ただし表示内容は異なる)、問題なく動作するのでしょうか?

リクエスト1が sw.Write(txt[i]); を実行しているときにリクエスト2が来ると、
リクエスト2は test.html を開くことができませんのでリクエスト2は失敗します。

リクエスト1が sw.Close(); を実行したあとにリクエスト2が来ると、リクエスト2は
test.html を上書きしますのでリクエスト1の出力したコードは失われ、リクエスト1
はリダイレクトによってリクエスト2が出力したものを参照することになります。

複数のクライアントが同時に処理を行う場合問題があります。

出力するコードがなにによって固定されるのかわかりませんが、
ファイルを出力せずに Response に直接出力したり、動的なページを作成するのが
よいと思います。
■No28308に返信(もりおさんの記事)
> 複数のクライアントが同時に処理を行う場合問題があります。
>
> 出力するコードがなにによって固定されるのかわかりませんが、
> ファイルを出力せずに Response に直接出力したり、動的なページを作成

やはり、問題があるのですね。わかりました。
Response は、この為あるものだったのですね。ありがとうございました。
■No28310に返信(esuさんの記事)
> Response は、この為あるものだったのですね。
いいえ、異なるリクエスト間で同一のファイルを作成し参照することはしない方がよ
いということ、そのことを理由として Response プロパティが Page クラスに存在す
るのではありません。Response プロパティは HTTP の規約にもとづいたサーバーか
らクライアントへのメッセージ送信として存在します。

DOBON.NET | プログラミング道 | プログラミング掲示板