がんふぃーるど室長の不定期ブログ

ただいま助手と悪戦苦闘中!

  ホーム :: 連絡をする :: 同期する  :: Login
投稿数  90  :: 記事 7 :: コメント 15113 :: トラックバック 13

ニュース


自己紹介

名前:がんふぃーるど
肩書:室長
種別:人間・男
資格一覧:
MCP 70-215 Installing, Configurating, and Administering Microsoft Windows 2000 Server
MCTS .NET Framework 2.0 - Distributed Applications
MCTS .NET Framework 2.0 - Web Applications

犬紹介


名前:なうら
肩書:助手
種別:犬・狆・メス
誕生日:2006/7/9
特技:鼻水飛ばし、甘噛、奇襲・急襲・強襲、そそう、お手、お座り、待て

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

わんくま勉強会#6のかるぼさんのセッションにインスパイアされて調べました。キッカケはかるぼさんがCountUpというWebMethod(WCFではOperationContract)を作った時、フィールドに値を保持しようとしていたことです。(ちなみに、下記の内容はほとんどセッション後に話してたものだったりしますw)

 

まず、WCFのインスタンスのライフサイクルを説明する前に、WCFが登場する以前の.NET RemotingだったりWebサービス(asmx)のインスタンスのライフサイクルをおさらいしたいと思います。

といったところで、いくつもあるわけではないのでサクっと行きます。

 

1.要求ごとにインスタンスを生成する。

WebサービスやASP.NETがこのタイプです。.NET Remoting も設定でこのタイプを指定することができます。

 

2.インスタンスを一つだけ生成する。(Singleton)

.NET Remotingは設定でこのタイプを指定することができます。

 

この二つのパターンがあります。

では、WCFではどうなったかというと、上記の二つに加え、セッションごとにインスタンスを生成するというものが増えています。つまり、

 

3.セッションごとにインスタンスを生成する。

 

というのが3つ目の選択肢がWCFで新たに追加されています。簡単に言ってしまえば、クライアントごとにインスタンスを生成するというもので、ステートフルなサービスを作ることができます。ASP.NETのセッションと同じですね。設定方法は以下の通り

 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService

 

IMyServiceはServiceContract、つまりサービスとして公開するインターフェースです。MyServiceはその実装で、その実装クラスにServiceBehaviorAttributeを付け、InstanceContextMode=InstanceContextMode.PerSessionを設定します。InstanceContextModeの列挙体は上記の説明からわかるように三つの値があります。

 

InstanceContextMode.PerCall
InstanceContextMode.Singleton
InstanceContextMode.PerSession

 

ところで、PerSessionでセッションごとにインスタンスを生成できるのはいいんだけど、サーバをクラスタ化している場合どうするんだろうか…ASP.NETみたいにDBに状態を保持させたりなんてできるのかな…それともロードバランサー側でクライアントのセッションが繋がるように割り振れということなのだろうか…というか、やっぱり分散系のベストプラクティスにあるようにステートレスな設計しなさいってことかな(´・ω・`)ショボーン

orz

投稿日時 : 2007年4月15日 0:50

コメント

# re: Windows Communication Foundation - インスタンスのライフサイクル 2007/04/15 9:06 THREE-ONE
> CountUp メソッド
私も気になってたんですが、そういうことができるんですね


# re: レッツら Windows Communication Foundation - インスタンスのライフサイクル 2007/04/18 23:23 刈歩 菜良
> > CountUp メソッド
> 私も気になってたんですが、そういうことができるんですね
シングルトンをデモるための布石だったのですよぉ。

ちなみに、.NET Remortingも同様に3種類でしたよ。




# re: レッツら Windows Communication Foundation - インスタンスのライフサイクル 2007/04/19 13:51 がんふぃーるど
>ちなみに、.NET Remortingも同様に3種類でしたよ。
マヂで?SingletonとSingleCallじゃありませんでしたっけ?それともクライアントアクティベーションの方も含めてます?

# re: レッツら Windows Communication Foundation - インスタンスのライフサイクル 2007/04/19 17:28 刈歩 菜良
あ、ごめんなさい。
きちんと読めていませんでした。
CAOがSingletonとSingleCallの2種で
SAOが1種類でした。

ごめんよぉ~。
(T_T)

# re: レッツら Windows Communication Foundation - インスタンスのライフサイクル 2007/04/19 18:05 がんふぃーるど
いあいあ、考えてみれば.NET RemotingもCAO合わせれば3種類だから、「サーバ側のインスタンスの生成方法が今までのより一つ増えた」って書かないとダメですね。
失礼しました。m(_ _)m
WebサービスだとCAOなんて無いからすっかり無視してました(テレテレ

あと、WCFでサーバ側がステートレスかステートフルかはインスタンスの生成方法ではなくReliable Session(Transportは除いて)を使用しているかしていないかみたいですね。(ぢつはPerSessionを使わなくてもAPサーバはステートフルになるってお話)
Session周りの記事を追加しよう…

それと、CAOとSAO逆になってまっせwのほほほ

# re: レッツら Windows Communication Foundation - インスタンスのライフサイクル 2007/04/23 10:43 刈歩 菜良
> CAOとSAO逆になってまっせw
きゃーほんとだ。

せんせー
(・o・)/
記事にするのはまだ不安なので、がんちゃんにちょいと確認。

CAO … PerSession
SAO SingleCall … PerCall
SAO Singleton … Single

と思うのはわたくしだけかしら?
ウラきちんと取れてないので自信なし。

# re: レッツら Windows Communication Foundation - インスタンスのライフサイクル 2007/04/24 8:39 がんふぃーるど
> せんせー (・o・)/
かるぼ先生にせんせーって呼ばれると不気味…

> CAO … PerSession
うーん、私も迷ったんですが、CAOってもっとクライアント主導でサーバ側のインスタンスの
ライフタイムを管理していたと思うんですよ。
WCFもプロキシクラスのClose()メソッドでサーバ側のインスタンスを破棄している様に見えますが、
これはどちらかと言うとセッションやチャネルを断ち切るものだと思っています。

# ただ、.NET Remotingから移行することを考えれば確かにCAO … PerSession でもいい気がします…
# 考えが固いかなー

# re: レッツら Windows Communication Foundation - インスタンスのライフサイクル 2007/04/24 11:22 刈歩 菜良
そだよね。

ま、ライフタイム管理は置いておいてふるまいから言うとあながち間違いでもないってことかな?
(*^_^*)

コメントの投稿

タイトル:
名前:
Url:
コメント: