1

Windows 2008 R2(IIS 7.5)で実行されているAsp.NetWebアプリケーションがあります。WWW1とWWW2の2つのサーバーがあり、DNSレコードは「www」のラウンドロビンDNS用に設定されています。AppPoolタイムアウトとセッション状態タイムアウト設定を増やして、ユーザーが20分後にログアウトしないようにしました。ただし、ユーザーがランダムにログアウトしていることに気付きました。何が起こっているのかと思うと、ユーザーはwww.foo.comにアクセスしてログインし、その後、ラウンドロビンがクラスター内の反対側のサーバー(WWW1またはWWW2)に移動し、Cookieが作成されなかったためにプロンプ​​トが表示されます。ログイン用。

これを機能させながら、ラウンドロビンDNSを使用して高可用性ソリューションを維持するにはどうすればよいですか?

4

1 に答える 1

7

ここでの問題は、各サーバーがメモリ内に独自のセッション状態を維持し、他のサーバーで作成されたセッションについて認識していないことです。

これを回避するには、デフォルトのInProcセッション状態プロバイダーを使用する代わりに、StateServerまたはSQLServerセッション状態プロバイダーを使用する必要があります。

これを行うには、ASP.NET状態サービスがサーバーの1つで実行されていることを確認してから、アプリケーションのweb.configファイルのsystem.webセクションに次の構成アイテムを追加して置き換える必要があります。 ASP.NET状態サービスを実行しているサーバーの名前が付いた「SampleStateServer」:

    <sessionState mode="StateServer"
      stateConnectionString="tcpip=SampleStateServer:42424"
      cookieless="false"
      timeout="20"/>

これに関するMicrosoftのドキュメントは、http://msdn.microsoft.com/en-us/library/ms178586.aspxで入手できます。

これをWebファームで実行しているため、両方のサーバーのWebアプリケーションが同じ暗号化キーを使用していることも確認する必要があります。

このためには、web.configにmachineKeyエントリを設定する必要があります。これには、web.configのsystem.webセクションに次のようなエントリを追加することが含まれます。

<machineKey validationKey="4D0590A0E4DE163BAD0EEEB6747467D770CD5FB2EA95BF02B27787A45CA579DECB01E2A1F16563DBAB44C1C0E54C7E53D65F2A7D0FDF378F4D3702B3F2C8B165" decryptionKey="928771D7B1B8C32608F56AC428EC5902985F6FB2E6E9A78733B6EAA493FA13F5" validation="SHA1" decryption="AES" />

あなたのために鍵を生成するいくつかのウェブサイトがあります。私は通常http://aspnetresources.com/tools/machineKeyを使用します

代わりにSQLStateプロバイダーを使用する場合は、http://msdn.microsoft.com/en-us/library/ms178586.aspxのページの[SQLServerモード]セクションにすべての構成情報があります。状態を保存するデータベースを構成する必要があるため、その設定は少し複雑です。

于 2013-01-23T06:03:04.457 に答える