1

ハイブリッド (MVC と従来の ASP ページの両方を使用) ASP (C#) ネット アプリケーションがあり、MVC とレガシー コードの両方に共通のエラー処理を実装する必要があります。つまり、無効な URL を検出し、無効な要求をホームページまたはログイン ページ (ユーザーがログインしているかどうかに応じて) に再ルーティングする必要があります。

「Application_Error」内にエラー処理コードを追加しました (以下のコードを参照)。

問題は次のとおりです。ログインしたユーザー ID が Session オブジェクトに保持され、一部の無効な URL では、セッション オブジェクトが null になり、「このコンテキストではセッション状態を使用できません」と表示されます。

例えば:

次の URL では、Session オブジェクトが存在します。

 1. http://myserver:49589/test/home/index
 2. http://myserver:49589/test/home/in
 3. http://myserver:49589/test/ho

ただし、次の URL の場合、セッション オブジェクトは null です。

 4. http://myserver:49589/te

したがって、問題は、リクエストのフォルダー名のスペルを間違えるとセッション オブジェクトが null になる理由と、この問題を解決する方法です。

ルーティング マップは次のとおりです。

context.MapRoute(
    "default",
    "test/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional }
);


protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Response.Clear();

    HttpException httpException = exception as HttpException;
    if (httpException != null) // Http Exception
    {
        switch (httpException.GetHttpCode())
        {
            case 400: // Bad Request
            case 404: // Page Not Found
            case 500: // Internal Server Error
                {
                    // Clear the error on server.
                    Server.ClearError();

                    ServerConfiguration scfg = ServerConfiguration.Instance;
                    if (ConnxtGen.App.AppUtility.GetCurrentUserID() != -1)
                    {
                        Response.RedirectToRoute("Unity_default", new { controller = "Home", action = "Index" });
                    }
                    else
                    {
                        Response.Redirect(scfg.PagePath + "/login/login.aspx", false);
                    }
                    break;
                }
            default:
                {
                    break;
                }
        }
    }
    // Avoid IIS7 getting in the middle
    Response.TrySkipIisCustomErrors = true;
}
4

1 に答える 1

1

理解しておくべきことの 1 つは、セッション変数は HttpApplication.AcquireRequestState イベントが発生した後にのみ使用できるということです。

あなたの質問では、セッションで何らかの情報を取得したい瞬間が、Asp.Net ページのライフサイクルのプロセスにおいて早すぎます。

セッションオブジェクトがいつ利用可能になるかをよりよく説明するこの投稿を見つけました:

Asp.net現在のセッションがnullの場合はどうすればよいですか?

そして、Asp.Net ページのライフサイクルの内部プロセス全体をより詳細に説明する素晴らしい記事を次に示します。

ASP.NET アプリケーションとページのライフ サイクル

于 2013-03-07T18:03:54.977 に答える