- PR -

WebServiceでstatic変数が初期化される

投稿者投稿内容
make
会議室デビュー日: 2003/10/02
投稿数: 4
投稿日時: 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/01/20
投稿数: 8
投稿日時: 2003-11-06 11:24
WebServiceもASP.NETの枠組み内で動作しているのでステートレスです。
なので、shareオブジェクトの生存期間は、そのWebServiceがリクエストを受けてからレスポンスを返すまでの間だと思います。

クッキーを使えばWebService内でもSessionオブジェクトを使えたと思いますが、ちょっと無理矢理かも、です。
クライアント側で連番を保持し、WebServiceに渡すというのはどうでしょう?
あみぃ
会議室デビュー日: 2003/01/20
投稿数: 8
投稿日時: 2003-11-06 13:33
捕捉です。
staticを使用しても、ステートレスであることに変わりはありませんので、やはりリクエスト〜レスポンス間でしか値を保持しないと思います。
(リクエスト時にプログラムが起動して、レスポンスを返した後に終了するイメージ)

あと、クライアントで連番を保持する場合は、例えばクライアント名+番号 といった形で、各クライアント毎になるかと思います。(Sessionを使っても同様)
もしアプリケーションレベルでのシーケンスな番号を保持するとしたら、DBを絡めた採番機能が必要になるのでは? と思います。
make
会議室デビュー日: 2003/10/02
投稿数: 4
投稿日時: 2003-11-10 16:06
Globalクラス内にstaticで変数を保持させると、
複数のトランザクション間でその変数を利用することが出来ています。

ここで記述したShare.lineについても、
複数トランザクション間で共有して、
その数値を変えた場合、正常に処理されています。

ですが、ファイル入出力をしたときにのみ、このline変数が0に初期化されてしまうのです。

ファイルの入出力時にこのline変数にアクセスしているわけではないのですが・・・。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-10 16:48
引用:

makeさんの書き込み (2003-11-06 11:06) より:

public class Global : System.Web.HttpApplication
{
public volatile static Share share;
・・・
}



 HttpApplicationクラスを継承したクラスを作ってアプリケーション中で使う、という使い方が間違っているように思うのですが???


引用:

MSDNライブラリ System.Web.HttpApplicationクラスの概要より:

このクラスのインスタンスは、開発者が直接作成するのではなく、ASP.NET インフラストラクチャで作成されます。


引用:

HttpApplication インスタンスの使用より:

アプリケーションの有効期間中、ASP.NET は、Global.asax から派生した HttpApplication インスタンスのプールを維持します。アプリケーションが HTTP 要求を受信すると、ASP.NET ページ フレームワークは、これらのインスタンスの 1 つを割り当てて要求を処理します。その特定の HttpApplication インスタンスは、割り当てられた要求の有効期間を管理します。この要求が完了するまで、同じインスタンスの再利用はできません。

toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2003-11-10 18:32
>Globalクラス内にstaticなオブジェクト

別にGlobalクラス内におく必要性はないと思うのですが。
何かほかに理由はあるのですか?

それは置いておいて、ファイルIOをした場合に限り
lineが0に初期化されるという現象については、
イマイチ分かりませんが。

ちなみにlineにはどのようにアクセスしてますか?

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-11-10 21:21
引用:

makeさんの書き込み (2003-11-10 16:06) より:
ですが、ファイル入出力をしたときにのみ、このline変数が0に初期化されてしまうのです。

ファイルの入出力時にこのline変数にアクセスしているわけではないのですが・・・。


書き込み先のファイルは何ですか?
Web.config あるいは、bin フォルダ内にあるファイルではないですか?
もしそうなら、そのWebアプリケーションのアプリケーションドメインがリロードされるためだと思います。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-11-10 21:24
引用:

Jittaさんの書き込み (2003-11-10 16:48) より:
 HttpApplicationクラスを継承したクラスを作ってアプリケーション中で使う、という使い方が間違っているように思うのですが???


いや、多分 VS.NET で ASP.NET のアプリを作成した場合は自動的にこうなると思います。

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