エラー処理 HttpModule には、ユーザーを適切なエラー ページにリダイレクトするコードが含まれていますが、それは行われておらず、スタック トレースを含む技術的な詳細を含むエラー ページが表示されています。
私は Visual Studio 2008 で Web アプリを維持しており、以前は Win XP で作業していたときに正常に動作していましたが、その後 Win 7 に移行し、ユーザーが表示するための適切なアクセス許可を持っていないときにこの問題に遭遇しました。選択したデータ。<system.webServer><modules>
ファイルのセクションにHttpModule を追加するなど、IIS 7 でアプリを動作させるために必要な変更を加えましたWeb.config
。他に何か欠けているものがあるのだろうか?
問題の詳細は次のとおりです。C# サービス層コード ファイルでメソッド GetAppData() を呼び出してデータをユーザーに表示する ObjectDataSource を使用する Web フォームがあります。サービス層ファイルは、ユーザーがデータを表示するための適切なアクセス許可を持っているかどうかを確認します。持っていないため、InvalidPermissionException
. これにより、Application_Error メソッドがトリガーされ、エラー処理 HttpModule で実行されます。これは、エラーをキャッチし、ユーザーをInvalidPermissionError.aspx
ページにリダイレクトする必要があります。ただし、代わりに表示されているのは、技術的な詳細とスタック トレースを含むエラー ページです。ユーザーフレンドリーなエラーページを表示するにはどうすればよいですか?
以下は関連するコードです(すべてを含めていません):
図 1: Web フォーム
<asp:ObjectDataSource ID="appDataSource" runat="server"
TypeName="Services.App.IAppService"
SelectMethod="GetAppData"
OnSelecting="appDataSource_Selecting"
OnObjectCreating="appDataSource_Creating">
<SelectParameters>
<asp:Parameter Name="Id" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
図 2: カスタム エラー処理 HttpModule
public class ErrorModule : IHttpModule
{
protected void Application_Error( object sender, EventArgs e )
{
if ( sender is System.Web.HttpApplication )
{
HttpApplication application = (HttpApplication)sender;
Exception exception = application.Server.GetLastError();
Exception baseException = exception.GetBaseException();
if ( exception is InvalidPermissionException )
{
HandleInvalidPermissionException(application,
(InvalidPermissionException)exception );
}
else if ( baseException.GetBaseException() is InvalidPermissionException )
{
HandleInvalidPermissionException( application,
(InvalidPermissionException)baseException );
}
}
図 3: ページ リダイレクト コード
private void HandleInvalidPermissionException( HttpApplication application, InvalidPermissionException exception )
{
application.Response.Redirect(String.Format("InvalidPermissionError.aspx?id={0}" ,
application.Request.Params["id"]) );
application.Server.ClearError();
Log.Error( exception.Message, exception );
}