2

IIS6、ASP.NET 2.0、フォーム認証なし

Response.Redirect( "〜/ foo.aspx")を呼び出していますが、私のサイトのデフォルトのドキュメント( "Default.aspx")が表示されています。さらに悪いことに、それは断続的にのみ発生します。リダイレクトによって正しいページが表示されることがあります。

セッションの状態を確認しましたが、web.configに値が表示されません(つまり、20分のデフォルトを使用していると想定しています)。

もっと関連性のある情報を共有したいのですが(質問に答えるために最善を尽くします)。

何か案は?指定されたページにリダイレクトされないのはなぜですか?

編集:私はコードを詳しく調べて、詳細を学びました。

Ok。foo.aspxとfoo2.aspx(およびデフォルトのドキュメントであるDefault.aspx)があります。すべてのページは、Pageを拡張するBasePageから拡張されます。

BasePageには、ReturnPageという名前のプロパティがあります。

protected string ReturnPage {
    get {
        if (Session["ReturnPage"] == null) {
            Session["ReturnPage"] = "";
        }
        return Session["ReturnPage"].ToString();
    }
    set { Session["ReturnPage"] = value; }
}

ユーザーがfoo.aspxのLinkBut​​tonをクリックすると、クリックイベントハンドラーは2行のコードで終了します。

ReturnPage = ResolveUrl("~/foo.aspx");
Response.Redirect(ResolveUrl("~/foo2.aspx"));

foo2.aspxのPage_Loadに問題があり、そのエラー処理でResponse.Redirect(ReturnPage)が呼び出されます。

foo2.aspxの応答ヘッダーを表示すると、302の場所はstring.Emptyです(つまり、1つはありません)。その同じ応答ヘッダーには、foo.aspxの応答と同じASP.NETセッションIDがあります。

そして覚えておいてください-これは断続的です。場合によっては、そのLinkBut​​tonをクリックして、foo2.aspxに簡単に移動できます。問題ありません。まったく同じデータでクリックを1回処理すると、失敗します。デフォルトのドキュメント(「バグ」によって送信されたDefault.aspx)からfoo.aspxに戻り、同じデータ(グリッド/テーブルの同じ行-同じLinkBut​​ton、基本的に)、問題なくfoo2.aspxにリダイレクトされます。

4

4 に答える 4

1

Response.Redirect() の直前のセッションに値を配置するのは危険です。

foo.aspx の Response.Redirect() を次のように変更すると、セッション値がより確実に保持される可能性があります。

Response.Redirect("~/foo2.aspx", false);

更新:これは、セッション状態を SQL Server に移動することによってのみ修正されました。関連する質問を参照してください:セッション書き込みがスレッド終了に対して脆弱なのはなぜ/いつですか?

于 2010-02-05T20:11:35.407 に答える
0

あなたが言う時:

リダイレクトによって正しいページが表示されることがあります。

それはただ起こっただけで、問題の影響を受ける特定のページがあるかどうかわかりませんか?この場合、おそらくアドレス指定の問題があります。アプリケーション相対パスではなく、相対パスまたは絶対パスのいずれかを使用できます。また、サイトのサブディレクトリからページに移動しようとしているのか、サイトのサブディレクトリに移動しようとしているのかと思います。アプリケーション相対パスを使用する場合は、サブディレクトリが考慮されていることを確認してください。(例:〜/ FooPages / Foo.aspx)

これが私が今見つけた良いリファレンスページです:http: //nathanaeljones.com/129/types-of-asp-net-paths/

于 2010-02-04T22:25:42.327 に答える
0

私はここで少し混乱しています。正確に何を達成しようとしていますか?302が空白であるため、デフォルトのドキュメントを取得しています。「一貫性のない」動作は、ほぼ確実に、セッションでデータを保存する方法が原因です。

ここでの本当の問題は、foo2.aspxに「問題がある」ときにリダイレクトする理由です。ここでの問題は何ですか?なぜリダイレクトするのですか?本当にリダイレクトする必要がある場合、なぜリダイレクトターゲットが変更されるのですか?静的なエラー報告ページにすると、問題ありません。

于 2010-02-04T23:49:14.070 に答える
0

リダイレクトして foo2.aspx から BasePage の新しいインスタンスを取得すると、その ReturnPage プロパティが再び null になることはありませんか? 次に、ページの読み込みエラーが発生してリダイレクトしようとすると、null 文字列にアクセスします。たぶん、そのプロパティをセッションに投げてみてください

Session.Add("ReturnPage","~/foo.aspx") 

それ以外の

ReturnPage = ResolveUrl("~/foo.aspx");

もちろん、ページの読み込みでエラー処理を変更して、プロパティではなくセッションから取得する必要があります。これが問題であることが判明した場合は、システムでリダイレクト全体がどのように機能しているかを再考する必要がある場合があります。

編集: プロパティが設定されていない、または正しく設定されているというこの考えをテストするには....(テストするために、そこにパスをハードコーディングすることをお勧めしません)、ゲッターを以下の例に変更してから、それが機能するかどうかを確認してください。これが問題ではない場合、問題が何であるかを知りたいと思っています。

get { 
   if (Session["ReturnPage"] == null) { 
        Session["ReturnPage"] = "~/foo.aspx"; 
    } 
    return Session["ReturnPage"].ToString(); 

} 
于 2010-02-04T23:10:23.440 に答える