IIS の InProc モードは色々制限あるんですね。InProc で同一プロセスにセッション情報を保持した場合、ワーカープロセスの多重度を 1 にしないと、他のワーカープロセスに割り振られた場合に、セッション情報が保持できないようです。ワーカープロセス内のスレッド数を増やすこともできますが、一つのワーカープロセスに詰め込むのも危険過ぎます。
うーん、これは問題です。InProcが高速化なと思っていたのですが、IIS で ASP.NET サービスを動作させるには、色々なサイトを見る限り、実質StateServer モードしかないのですね。( だったら、最初から言ってくれればいいのに... と、指摘してくれなかった *誰か* に対してブログで愚痴ってみる。IIS や ASP.NET にあまりにも無知だった自分も悪いんですが... ) とはいえ、改善をしなければいけないので、StateServer への変更手順を調べてみました。
- 『 ASP.NET State Service 』 を起動する。デフォルトでは手動になっているので、プロパティ設定で、常に起動するようにしておいてください。
- Web.config の sessionState mode を StateServer に変更します。
- セッションに保持するオブジェクトすべてに [Serializable] 属性を付加する。
ただ一部、Serializable にできないオブジェクトが存在しますので、気をつける必要があります。SQLConnection がそれに該当します。このようなオブジェクトをセッションにのせる必要がある場合は、その変数等を含むクラスに Serializable 属性属性を付加し、IDeserializationCallback インターフェースの OnDeserialization メソッドを実装する必要があります。逆シリアル化が発生した場合に、OnDeserialization メソッド内で、インスタンスを生成する必要があります。
※この手のものは、デフォルト設定から見なおしてほしいなぁ.....
やはり、ちゃんと細部まで技術調査しないといけないですね...