3

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

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);
}

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

どうしてこうなるのか...??

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

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

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

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

助けてください。

4

6 に答える 6

2

ここでの別の推測ですが、おそらくアプリケーションディレクトリ内の何かを変更したためですServer.MapPath~. IIS は、アプリが変更されたと考えてアプリケーションをリサイクルし、その結果、すべてのセッションを消去する可能性があります。

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

そのコード行を含めた場合にのみ発生するとおっしゃいましたが、アプリケーションが IIS によってリサイクルされるかタイムアウトになると、セッションは一貫して消去されるだけです (自分で手動で行っている場合を除く)。明らかにタイムアウトではないので、リサイクルが起こっているに違いありません。

于 2010-02-24T17:44:30.470 に答える
1

仮想ディレクトリ内のフォルダを削除すると、アプリケーションが再起動し、すべてのセッション データが失われる可能性があります。これを防ぐには、個々のファイル (フォルダーではなく) を削除するか、StateServer を使用してセッションを維持します。

于 2010-02-24T17:27:07.217 に答える
1

「ファイル」フォルダは Web アプリケーション フォルダにありますか? ファイルを削除すると、アプリケーションが再起動する可能性があります。sessionStateServer を使用してみてください。セッションを維持します。

Web.config:

<configuration>
    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
</configuration>
于 2010-02-20T22:43:41.617 に答える
0

削除ボタンを押す前にページが正しく読み込まれるため、問題はおそらくSession["loginid"].ToString()参照にあります。他に参照するコードはありますSession["loginid"]か?ここに示したコードはloginid、セッションから削除するものは何もしません。

ただし、このアプリケーションがサーバークラスタで実行されており、デフォルトのセッションモードのインプロセスを使用している場合、HTTPリクエストは異なるサーバーによって処理されるため、HTTPリクエスト間のセッションにアクセスできなくなる可能性があります。詳細については、こちらをご覧ください。

于 2010-02-20T20:56:03.437 に答える
0

コードから directory.delete() 関数を削除すると、アプリケーション全体が例外なく正常に実行されます

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

このファイル操作の実行中にアプリケーションが例外をスローし、新しいセッションが開始されると思います。私のプロジェクトの 1 つに似たような状況がありますが、まだ解決方法がわかりません。

Global.asaxを作成し、 Application_OnErrorおよびSession_OnStartにブレークポイントを設定する場合(またはこれらのメソッドのスペルが正しい場合)、説明に同意していただけると確信しています。エラーが発生し、その後新しいセッションが開始されることがわかります。

于 2010-02-20T21:16:44.603 に答える
0

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

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

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

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

ありがとう

于 2010-02-20T22:54:56.550 に答える