セッション変数オブジェクトがポストバック時に削除される - ASP.NET

StackOverflow https://stackoverflow.com/questions/2303642

質問

次のようなコードを作成しました。

protected void Page_Load(object sender, EventArgs e)
{
   Label1.Text = Session["loginid"].ToString();
}

protected void delete_click(object sender, EventArgs e)
{
    delete("mail1",Session["loginid"]);
}

private int delete(string mailid, string user)
{
 System.IO.Directory.Delete(Server.MapPath(@"~\files\" + user + @"\" + mailid), true);
}

削除ボタンを押すと、すべてが正常に動作し、フォルダーが削除されます。しかし、その後、ページが再びポストバックすると、 NullRefrenceException は Label1.Text = Session["loginid"]です。ToString();

なぜそうなるのか…??

この Directory.Delete() メソッドを使用していないときは、すべてが正常に動作し、セッション変数は null に設定されません。

アプリケーションをトレースしたところ、Directory.Delete() メソッド後のセッション変数はそのままであり、Directory.Delete() 後の処理でそれらのセッション変数を使用できることがわかりました。

ただし、ページがポストバックするとすぐに、すべてのセッション変数が null に設定されます。そして、この delete() メソッドを使用していない場合、この問題は発生しません。

削除しているフォルダーはプロジェクトのフォルダー内にあります。この Web サイトは Visual Studio を使用して実行しています。

助けてください。

役に立ちましたか?

解決

あなたは、あなたのアプリケーションディレクトリ(Server.MapPathを使用して使用して~以来の勘)で何かを修正するため、

ここでちょうど別の推測が、多分それはです。 IISは多分アプリが変化していると考えて、アプリケーションをリサイクルし、結果はすべてのセッションを払拭するようます。

これは、誰かがアプリを使用している間、あなたのweb.configファイルを変更した場合に似ており、それはすべてのセッションをドロップしてアプリをリサイクルしています。あなたはIISのアプリケーションのために使用されている情報を含むことができ、ディレクトリを削除していますか?

あなたは(あなたが手動でそれを自分でやっている場合を除く)、アプリケーションがIISまたはタイムアウトすることにより、リサイクルされたときに、コードとセッションのラインが本当に唯一の一貫一掃れます含まれている場合、それだけ起こると述べました。リサイクルは何が起こっているかでなければならないので、それは明らかにタイムアウトされていません。

他のヒント

あなたの「ファイル」フォルダには、Webアプリケーションフォルダ内のですか?ファイルを削除するときに多分アプリケーション自体を再起動します。 sessionStateServerを使用してみてください。そのキープセッション生きてます。

のWeb.configます:

<configuration>
    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
</configuration>

あなたの仮想ディレクトリのフォルダを削除すると、したがって、すべてのセッションデータを失う、再スタートにあなたのアプリケーションを引き起こす可能性があります。これを防ぐため、どちらかの削除個々のファイル(いないフォルダ)をしたり、セッションを維持するためには、StateServerを使用する。

ページのロードが正しくあなたが削除ボタンを押す前ので

は、問題がSession["loginid"].ToString()参照して考えられます。あなたは参照がSession["loginid"]ことを他のコードをお持ちですか?あなたがここに示されているコードは、セッションからloginidを削除何もしません。

このアプリケーションは、サーバークラスタ上で実行されていて、あなたがしているインプロセスのデフォルトセッションモードを使用している場合、それらは異なるサーバーによって処理しているため、しかし、あなたは、HTTPリクエスト間でセッションへのアクセスを失うことができます。詳細については、ここを参照してください。

directory.delete()を削除すると 関数をコードから抽出し、次に全体 アプリケーションは、 例外

さて、問題が見つかったようです。プロジェクトには、ディレクトリを削除するために必要な権限がありません (ディレクトリが削除された場合でも)。特権の問題があります)

このファイル操作の実行中にアプリケーションが例外をスローし、新しいセッションが開始されたと思います。私のプロジェクトでも同様の状況に陥っていますが、解決方法がまだわかりません。

を作成すれば、この説明に同意していただけると確信しています。 グローバル.asax そしてブレークポイントを設定します アプリケーション_オンエラー そして セッション_開始時 (ただし、これらのメソッドの綴りは正しいです)。エラーが発生し、その後新しいセッションが開始されることがわかります。

まず、いくつかの健全性チェックを行います。

  1. セッションは他のページで期待どおりに機能しますか?
  2. Delete メソッドで App_Data や App_Code などの特別な ASP.NET フォルダー内のファイルを削除しているため、アプリケーションが再起動する可能性がありますか?

上記を確認した後、この問題をデバッグしようとするものは次のとおりです。

  1. delete メソッドにブレークポイントを設定し、ウォッチ ウィンドウにセッション変数を設定します。Directory.Delete の呼び出し前と呼び出し後のセッション変数の値を確認します。セッションが失われるのはその時点ですか、それとも次のページにアクセスするまでですか?
  2. Fiddler などのツールを使用して、ポストバック時にブラウザと Web サーバー間で交換される Cookie を調べます。ブラウザが最初にアクセスしたときに、新しいセッション Cookie が作成され、ブラウザに保存されていることを確認します。次に、フォルダーを削除するときに、Web サーバーが 新しい そのポストバックの応答のセッション Cookie。これは、新しいセッションが作成されたことを示します。

ありがとう

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top