以下は私にとってはうまくいきます。_loggedInTime の前にアンダースコアを付けたので、ページ自体のインスタンス変数として宣言したと仮定しています。
private DateTime _loggedInTime;
protected void Page_Load(object sender, EventArgs e)
{
if (Session["LoggedInTime"] == null)
Session["LoggedInTime"] = DateTime.Now;
_loggedInTime = Convert.ToDateTime(Session["LoggedInTime"]);
TimeSpan elapsedtimespan = DateTime.Now.Subtract(_loggedInTime);
int elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);
}
上記の例のように Page_Load ではなく、別の時点で経過時間を計算していると思います。
各ポストバックで、経過時間を計算する前に、セッションからの経過時間を正しくロードしていることを確認してください。次の投稿で、_loggedInTime は DateTime のデフォルト値である {1/1/0001 12:00:00 AM} にリセットされます。
次の設定に何かがあると思います。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["LoggedInTime"] == null)
Session["LoggedInTime"] = DateTime.Now;
_loggedInTime = Convert.ToDateTime(Session["LoggedInTime"]);
}
}
private void ButtonClick(object sender, ImageClickEventArgs e)
{
TimeSpan elapsedtimespan = DateTime.Now.Subtract(_loggedInTime);
int elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);
}
ここでは、ボタンがクリックされたときにポストバックを処理することでそれを示します。その場合、Page_Load は LoggedInTime をロードせず、経過時間が正しく計算されません。これを解決するには、Page_Load の IsPostBack if ステートメントを削除するだけです。ページをロードするたびにインスタンス変数 _loggedInTime を設定してください。つまり、ポストバックでも設定してください。
備考: サーバー ファーム上にいるかどうかも確認してください。リクエストを処理するために複数のサーバーを使用しているが、間違ったセッション モードを設定している場合 (処理中など)、サーバー A はセッション変数をメモリに保存しますが、リダイレクトはサーバー B で処理できます。サーバー A のメモリ内セッション ストア。
詳細については、MSDN を参照してください。
セッション状態モード
In process セッション状態がデフォルトです。サーバー ファームのシナリオでは、StateServer または SqlServer の代替手段を使用して、サーバー間でセッション状態を共有できます。または、独自のカスタム セッション状態プロバイダーを作成することもできます。