- - PR -
WebServiceでstatic変数が初期化される
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-11-06 11:06
WebServiceを使ってアプリケーションを作っているのですが、
ログで連番が必要ということでGlobalクラス内にstaticなオブジェクトshareを置いています。 public class Share { public decimal line; public Share() { line = 0; } } public class Global : System.Web.HttpApplication { public volatile static Share share; ・・・ } このクラスを使ってlineの変数を保持しようとしているのですが、 WebService内でファイルの出力(ログの出力)を行うとlineの値が0に戻ってしまいます。 これについて対応をご存知の方は教えていただけないでしょうか。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2003-11-06 11:24
WebServiceもASP.NETの枠組み内で動作しているのでステートレスです。
なので、shareオブジェクトの生存期間は、そのWebServiceがリクエストを受けてからレスポンスを返すまでの間だと思います。 クッキーを使えばWebService内でもSessionオブジェクトを使えたと思いますが、ちょっと無理矢理かも、です。 クライアント側で連番を保持し、WebServiceに渡すというのはどうでしょう? | ||||||||||||
|
投稿日時: 2003-11-06 13:33
捕捉です。
staticを使用しても、ステートレスであることに変わりはありませんので、やはりリクエスト〜レスポンス間でしか値を保持しないと思います。 (リクエスト時にプログラムが起動して、レスポンスを返した後に終了するイメージ) あと、クライアントで連番を保持する場合は、例えばクライアント名+番号 といった形で、各クライアント毎になるかと思います。(Sessionを使っても同様) もしアプリケーションレベルでのシーケンスな番号を保持するとしたら、DBを絡めた採番機能が必要になるのでは? と思います。 | ||||||||||||
|
投稿日時: 2003-11-10 16:06
Globalクラス内にstaticで変数を保持させると、
複数のトランザクション間でその変数を利用することが出来ています。 ここで記述したShare.lineについても、 複数トランザクション間で共有して、 その数値を変えた場合、正常に処理されています。 ですが、ファイル入出力をしたときにのみ、このline変数が0に初期化されてしまうのです。 ファイルの入出力時にこのline変数にアクセスしているわけではないのですが・・・。 | ||||||||||||
|
投稿日時: 2003-11-10 16:48
HttpApplicationクラスを継承したクラスを作ってアプリケーション中で使う、という使い方が間違っているように思うのですが???
| ||||||||||||
|
投稿日時: 2003-11-10 18:32
>Globalクラス内にstaticなオブジェクト
別にGlobalクラス内におく必要性はないと思うのですが。 何かほかに理由はあるのですか? それは置いておいて、ファイルIOをした場合に限り lineが0に初期化されるという現象については、 イマイチ分かりませんが。 ちなみにlineにはどのようにアクセスしてますか? | ||||||||||||
|
投稿日時: 2003-11-10 21:21
書き込み先のファイルは何ですか? Web.config あるいは、bin フォルダ内にあるファイルではないですか? もしそうなら、そのWebアプリケーションのアプリケーションドメインがリロードされるためだと思います。 | ||||||||||||
|
投稿日時: 2003-11-10 21:24
いや、多分 VS.NET で ASP.NET のアプリを作成した場合は自動的にこうなると思います。 |