- PR -

ASP.NETを使ったブラウザ上でのグラフ表示

1
投稿者投稿内容
少管閑事
会議室デビュー日: 2003/10/17
投稿数: 8
投稿日時: 2007-06-30 19:44
aspxファイルにイメージでグラフを貼り付けて、ブラウザ画面の左側でデータを選択すると、右側に選択データに応じたグラフを表示しようとしています。
Visual Studio 2005のデバッグ用サーバでは良好に動作したので、本物のWEBサーバにアップロードして実行すると、最初の1回目は動作するのですが、データを変更して再表示しても最初の1回目のグラフが表示されてしまいます。以後データをどう変更しても1回目のグラフしか表示されません。
ブラウザの更新ボタンを押すと「情報を再送信しないと、ページを更新できません」のメッセージボックスが表示され、再試行を押すと更新された正しいグラフが表示されます。
古いグラフがキャッシュに蓄積されているのではと思ったのですが、デバッガでCache.countをトレースすると、デバッグ用サーバでも本物サーバでもいつも0のままとなります。Cache.GetEnumerator()を実行しても何も取得できません。
HttpResponse.AddFileDependenciesでグラフのファイル名を指定して、グラフが上書き変更されるとキャッシュデータがリフレッシュされるように設定しても、動作に変化がありません。
グラフはC#のプログラムで生成しています。GIFでもJPEGでもBMPでも2回目が古いままなのは同じです。
なお、下記のように作成したグラフだけを単独で表示させると本物サーバでも動作します。
graph.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
ただこれでは画面左側のデータ選択画面が消えてしまうので、できれば避けたいと思います。
使用しているブラウザはIE6.0のSP2です。
デバッグ用サーバと本物サーバで動作が異なるのはキャッシュのせいではないのでしょうか。キャッシュについて何か誤解しているでしょうか。古いグラフはどこに蓄積されていて、蓄積を消去するにはどうすればいいのでしょうか。
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-06-30 20:25
画像はSystem.Web.UI.WebControls.Image クラス
に表示されいるのでしょうか。
ブラウザ(クライアント側)でのキャッシュが原因という可能性はありませんか。
もしそうならば、
Image.ImageUrl プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.image.imageurl(VS.80).aspx
で再表示の都度、
Image.ImageUrl=(画像のURL)?XXXXXXXXX
XXXXXXXXXの部分が変わるように指定してはいかがでしょうか。
XXXXXXXXXはDateTime 構造体などから生成するようにします。
少管閑事
会議室デビュー日: 2003/10/17
投稿数: 8
投稿日時: 2007-06-30 21:14
グラフはサーバ上にGIFファイルとしていったんSAVEし、それを表示するように作っています。
具体的には下記のとおりです。
(1)デザイナでImageを画面に貼り付け
(2)ImageのImageUrlプロパティにグラフの所定ファイル名を設定
(3)操作者が所定のデータを選択しボタンを押すと、C#プログラムでグラフイメージを生成して所定ファイルに保存。
(3-1)Bitmapオブジェクトを生成
(3-2)Bitmapオブジェクトにグラフを描画
(3-3)グラフBitmapをImageUrlで指定したファイルにSAVE
(3-4)ImageのVisibleプロパティをプログラムでEnableにセット

これでVisual Studio 2005のデバッグ用ブラウザでは動作します。データを変更するとそれに応じてグラフも変わります。
本番用サーバでは最初の1回目のグラフが表示され、データを変更してもグラフは変わりません。ブラウザの更新ボタンを押すとメッセージボックスが表示されて所望のグラフが表示されます。
おっしゃるように動作を見るとクライアント側のキャッシュに思えるのですが、サーバのプログラムではキャッシュの制御はできないものなのでしょうか。

イメージURLの動的な変更は困難です。理由はプログラムで生成するグラフ画像ファイルの属性を書き込み可に設定する必要があるのですが、当方で使っているWEBサーバのプロバイダは、プロバイダの管理ページにログインして、ファイル名を指定して手動で書き込み可に設定する必要があります。FTPで参照できるファイルの属性はプロバイダ側で使っていないのです。(FTPで属性を見たら全ファイル000になっています。)
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-06-30 21:18
引用:

少管閑事さんの書き込み (2007-06-30 19:44) より:

古いグラフがキャッシュに蓄積されているのではと思ったのですが、デバッガでCache.countをトレースすると、デバッグ用サーバでも本物サーバでもいつも0のままとなります。Cache.GetEnumerator()を実行しても何も取得できません。
HttpResponse.AddFileDependenciesでグラフのファイル名を指定して、グラフが上書き変更されるとキャッシュデータがリフレッシュされるように設定しても、動作に変化がありません。


この場合の Cache.count は aspx ファイルのキャッシュ情報だと思います。
画像ファイルをそのまま表示する場合ファイル名などが変わらないとIEは同一ファイルだと思い自分のキャッシュを使用してしまいます。

ashx などを利用してファイルを動的に表示したり、IIJIMASさんのあげられた方法で、イメージファイルのURLを微妙に変えてあげることでキャッシュを使わせないようにはできます。

_________________
かるあ のメモスニペット
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-06-30 21:20
引用:

少管閑事さんの書き込み (2007-06-30 21:14) より:

イメージURLの動的な変更は困難です。理由はプログラムで生成するグラフ画像ファイルの属性を書き込み可に設定する必要があるのですが、当方で使っているWEBサーバのプロバイダは、プロバイダの管理ページにログインして、ファイル名を指定して手動で書き込み可に設定する必要があります。FTPで参照できるファイルの属性はプロバイダ側で使っていないのです。(FTPで属性を見たら全ファイル000になっています。)


この場合イメージファイルのファイル名を変更する必要はありません。
たとえば xxx.png?X=123456 と xxx.png?X=999999 は別ファイルとして認識します。
_________________
かるあ のメモスニペット
少管閑事
会議室デビュー日: 2003/10/17
投稿数: 8
投稿日時: 2007-06-30 21:45
IIJIMASさん、かるあさん。ありがとうございます。
おっしゃるように?の後ろに現在時刻をつけたらグラフがちゃんと更新されるようになりました。
具体的にはグラフ生成のたびにImageのImageUrlプロパティを、ファイル名に?と現在時刻を付加するようプログラムで書き換えるようにしました。
このような方法があるとは思いつきませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)