- - PR -
Web参照について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-03-03 12:08
いつも参考にさせて戴いています。
とても初心者的な質問で恐縮なのですが、現状、 ASP.NET → Webサービス( DBアクセス用クラス) → DB という流れでDBからデータを獲得しているシステムを作成しています。 Webサービスが使用しているDBアクセス用のクラスで、 設定用の一般ファイルの内容を取り込んで使用しているのですが、 この一般ファイルの内容を変更した場合、ASP.NETのWeb参照を 更新しなければ内容が反映されません。 Webサービス内では、DBアクセス時にアクセスクラスをNewしています。 ASP.NETからトリガーが与えられた時に一般ファイルの内容を読み込む 処理が発生するので、一般ファイルの内容は反映されるように思えるのですが、 実際にはASP.NETのプロジェクトを開いて、Web参照の更新を行なわなければ 反映されないのです。 実際の動きから判断すると、ASP.NET側でWebサービスの参照を行なった時点で 一般ファイルの内容等の関係するもの全て取り込み、動作時にはそれを使う (アーカイブリンクみたいなイメージ)のように思えます。 Web参照というのは、こういうものなのでしょうか?? そういうもの(アーカイブリンクみたいなイメージ)であるならば、 今やろうとしている「変更は一般ファイルを変更すれば反映される」 みたいなものは無理なのでしょうか。 御存知の方がいらっしゃいましたら、ぜひお教え下さい。 宜しくお願い致します。 ※誤字修正 [ メッセージ編集済み 編集者: 夏姫☆ 編集日時 2004-03-03 12:09 ] | ||||
|
投稿日時: 2004-03-03 12:49
Webサービス単体でテストしたとき、設定用のファイルの修正内容は
きちんと反映できているのでしょうか? 記述されていることだけでは、ここが確実にテストされているか どうかがわからないのですが。。。 | ||||
|
投稿日時: 2004-03-03 13:17
Webサービスの単体テストではファイルの変更内容は 反映されています(思った通りの動きをしている)。 ASP.NETからWeb参照の場合だと上手くいかないのです。 そのため、Web参照はアーカイブリンクイメージなのかなと 思った次第です。 | ||||
|
投稿日時: 2004-03-03 15:21
Web参照を行ったとき、実際にはWebサービスをよびだすためのプロキシとなる
クラスが自動生成されています。 設定ファイルを読み込むことによって、インタフェースが変わる、というような ことでなければ、変更は反映されそうなものですけどね。 もうちょっと具体的な部分の話がないと、何が起きてるかわからないかな。 | ||||
|
投稿日時: 2004-03-03 16:32
小野@どっとねっとふぁんさんコメントありがとうございます。 あまり細かく書きすぎると却って分かりづらくなるかと思ったのですが、 具体的に書いてみます。 DBアクセスクラスで読み込んでいる設定ファイルは 取得したデータのセルの表示幅(px)が記述されているもので、 幅(数値)が変わるだけで、変更によりインタフェースが変わるという ようなものではありません。 ASP.NET側のDataGridテンプレート作成時にセルの表示幅を使用する為、 DBからのデータ取得時に 1.データ取得 2.セル幅取得 3.取得したセル幅をDataGridのテンプレートに指定 の手順を行なうことにしています。 そして、この「2.セル幅取得」で、Web参照すると設定ファイルの内容を 変更しても反映されないのです。 (仕様が美しくないのはご容赦下さい。諸事情ありまして…。) ↓長くなっちゃいました、申し訳ないです。 ◆ASP.NETコード・ビハインド ☆印の部分がWebサービスの呼出 private void Button1_Click(object sender, System.EventArgs e) { // Webサービスのインスタンス化 IsmsSvc.IsmsService webSvc webSvc = new IsmsSvc.IsmsService(); readData = new DataSet(); readData = webSvc.IsmsDataListRead(); object[] dataWidth = webSvc.IsmsDataWidthRead(); ←☆ (省略)DataGrid1テンプレート作成等 : DataGrid1.DataBind(); } ◆Webサービス ★印の部分がDBアクセスクラスの呼出 [WebMethod] public DataSet IsmsDataListRead() { DataSet readData; try { IsmsData dataService = new IsmsData(); readData = dataService.GetIsmsDataList(); } catch ( Exception ex ) { // (省略)異常発生時の処理 } return readData; } [WebMethod] public ArrayList IsmsDataWidthRead() { ArrayList widthData; try { IsmsData dataService = new IsmsData(); widthData = dataService.GetIsmsDataWidth(); ←★ } catch ( Exception ex ) { // (省略)異常発生時の処理 } return widthData; } ◆DBアクセスクラス public class IsmsData { private ArrayList dataList; private int listMax; public IsmsData() { IsmsDataInfo dataInfo = new IsmsDataInfo(); dataList = dataInfo.GetIsmsDataInfo(); // データ情報 listMax = dataInfo.GetListMax(); // データ情報件数 } public DataSet GetIsmsDataList() { SqlCommand command = new SqlCommand(); DataTable result; try { command.CommandText = "SELECT * FROM ISMSDATA"; result = GetDataTable( command ); } catch ( Exception ex ) { // (省略)異常発生時の処理 } DataSet resultData = new DataSet(); resultData.Tables.Add( result ); return resultData; } public ArrayList GetIsmsDataWidth() { ArrayList dataWidth = new ArrayList(); for ( int i=0; i<listMax; i++ ) { dataWidth.Add( ( ( IsmsDataInfo.DataInfo )dataList[i] ).listWidth ); } return dataWidth; } protected DataTable GetDataTable( SqlCommand command ) { DataTable result = new DataTable(); // (省略)DBからデータの獲得 return result; } } public class IsmsDataInfo { public class DataInfo { public string listName; // 一覧表示見出名 public int listWidth; // 一覧表示セル幅 } private string confFileName = "D:\\config\\IsmsDataInfo"; private int listMax; public int GetListMax () { return listMax; } public ArrayList GetIsmsDataInfo() { ArrayList dataList = new ArrayList(); if ( File.Exists( confFileName ) ) { StreamReader stReader = new StreamReader( confFileName, System.Text.Encoding.GetEncoding( "Shift-JIS" ) ); string lineData = null; while ( ( lineData = stReader.ReadLine() ) != null ) { if ( ( lineData.Substring( 0, 1 ) ).Equals( "#" ) ) { continue; } string[] str = lineData.Split( new char[2]{',','\t'} ); DataInfo info = new DataInfo(); info.listName = str[0]; info.listWidth = int.Parse( str[1] ); dataList.Add( info ); } stReader.Close(); } listMax = dataList.Count; return dataList; } } | ||||
|
投稿日時: 2004-03-04 17:02
#すみません、プログラムは読んでません。。。
aspx側でWebサービスから取り出したデータの値は確認していますか? それとも、見た目だけで判断されているのでしょうか。 要するに、キャッシュにデータが残っている、という状況ではないのかと 疑っています。 このあたり、検証されたかどうかの記述がないので。。。 | ||||
|
投稿日時: 2004-03-04 22:11
夏姫☆さん:
プログラムソースをコピペしても、それを読んでくれる人はごく少数と思っておく方がよいと思います。それよりも、それぞれのコマンドで何をしているか、日本語で書いてみてください。 一例: private void Button1_Click(object sender, System.EventArgs e) { // Webサービスのインスタンス化 IsmsSvc.IsmsService webSvc webSvc = new IsmsSvc.IsmsService(); readData = new DataSet(); readData = webSvc.IsmsDataListRead(); object[] dataWidth = webSvc.IsmsDataWidthRead(); ↓↓↓↓↓↓ ボタンクリックイベントハンドラ webSvc = Webサービスのゲートウェイクラスを生成 readData = データセット生成 readData = webSvc.データリストを読み込む dataWidth = wevSvc.データを配列で取り込む 他の人に読んでもらいやすい(他の人が読みやすい)のと、こうして整理しているうちに自己解決できてしまうこともあります。 | ||||
|
投稿日時: 2004-03-08 11:10
Jittaさん、アドバイスありがとうございます。 以後、気をつけたいと思います。
aspx側で取り出した値を表示しての確認と キャッシュ・クリアしての検証は行なっています。 結果は変わらずでした。 キャッシュ・クリアについてはクライアントを4台用意し、 以下のような検証を行ないました。 手順1:1回目表示(設定ファイル変更前状態…内容Aとする) 表示結果 端末1:設定ファイル内容A表示 端末2:設定ファイル内容A表示 → キャッシュクリア 端末3:表示させず 端末4:表示させず 手順2:設定ファイル内容変更(変更後状態…内容Bとする) 手順3:端末2のキャッシュをクリアする 手順4:2回目表示 表示結果 端末1:設定ファイル内容A表示(内容変更が反映されず) 端末2:設定ファイル内容A表示(内容変更が反映されず) 端末3:設定ファイル内容A表示(内容変更が反映されず) 端末4:表示させず 手順5:Web参照更新、再ビルド 手順6:端末3のキャッシュをクリアする 手順7:3回目表示 表示結果 端末1:設定ファイル内容B表示 端末2:設定ファイル内容B表示 端末3:設定ファイル内容B表示 端末4:設定ファイル内容B表示 また長くなってしまいました。すみません。 もう少しMSDN等調べてみたいと思います。 |