1

以下に示すように、セッションに日時を保存しています:-

Session["LoggedInTime"] = System.DateTime.Now;

次に、次のようにページの読み込み時にこの値を取得します:-

DateTime _loggedInTime = Convert.ToDateTime(Session["LoggedInTime"]);

上記のコード コードをデバッグすると、ここまで _loggedInTIme が格納されている正しい日付を示していることがわかりました。その後、次のように期間を計算します:-

TimeSpan elapsedtimespan = System.DateTime.Now.Subtract(_loggedInTime);
int elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);

コードのデバッグ中に、_loggedInTime = {1/1/0001 12:00:00 AM} を減算しているときに、正確な経過時間を取得できないことがわかりました。

TimeSpan の計算時に _loggedInTime が {1/1/0001 12:00:00 AM} になる理由がわからないので、この問題を解決するのを手伝ってください。

4

2 に答える 2

2

これがDateTimeのデフォルト値であるため、 Sessionオブジェクトで以前に初期化されていないときにloggedInTimeを使用しようとしていると思います。言い換えれば、私の提案はこれらの線に沿って何かを試すことです:

int elapsedtime = 0;
if (Session["LoggedInTime"] != null)
{
    DateTime _loggedInTime = (DateTime)Session["LoggedInTime"];
    TimeSpan elapsedtimespan = System.DateTime.Now.Subtract(_loggedInTime);
    elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);
}
else Session["LoggedInTime"] = System.DateTime.Now;
于 2012-06-23T07:00:06.043 に答える
2

以下は私にとってはうまくいきます。_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 の代替手段を使用して、サーバー間でセッション状態を共有できます。または、独自のカスタム セッション状態プロバイダーを作成することもできます。

于 2012-06-23T07:02:37.600 に答える