都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

【今更】 IISは、InProcモードじゃなくて、StateServer モードです。

 IIS の InProc モードは色々制限あるんですね。InProc で同一プロセスにセッション情報を保持した場合、ワーカープロセスの多重度を 1 にしないと、他のワーカープロセスに割り振られた場合に、セッション情報が保持できないようです。ワーカープロセス内のスレッド数を増やすこともできますが、一つのワーカープロセスに詰め込むのも危険過ぎます。

 うーん、これは問題です。InProcが高速化なと思っていたのですが、IISASP.NET サービスを動作させるには、色々なサイトを見る限り、実質StateServer モードしかないのですね。( だったら、最初から言ってくれればいいのに... と、指摘してくれなかった *誰か* に対してブログで愚痴ってみる。IISASP.NET にあまりにも無知だった自分も悪いんですが... ) とはいえ、改善をしなければいけないので、StateServer への変更手順を調べてみました。

  1. ASP.NET State Service 』 を起動する。デフォルトでは手動になっているので、プロパティ設定で、常に起動するようにしておいてください。f:id:koogucc11:20130714144044j:plain
  2. Web.config の sessionState mode を StateServer に変更します。
  3. セッションに保持するオブジェクトすべてに [Serializable] 属性を付加する。

 ただ一部、Serializable にできないオブジェクトが存在しますので、気をつける必要があります。SQLConnection がそれに該当します。このようなオブジェクトをセッションにのせる必要がある場合は、その変数等を含むクラスに Serializable 属性属性を付加し、IDeserializationCallback インターフェースの OnDeserialization メソッドを実装する必要があります。逆シリアル化が発生した場合に、OnDeserialization メソッド内で、インスタンスを生成する必要があります。

※この手のものは、デフォルト設定から見なおしてほしいなぁ.....

 

やはり、ちゃんと細部まで技術調査しないといけないですね...