ハイブリッド (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;
}