Ошибка обработки HttpModule имеет код для перенаправления пользователя на соответствующую страницу ошибки, но это не так, вместо этого отображается страница с ошибкой с техническими деталями, включая трассировку стека.Собственная обработка ошибок ASP.NET HttpModule не перенаправляет на страницу обработки ошибок
Я поддерживаю веб-приложение под Visual Studio 2008, и он работал нормально, работая над ним под Win XP, но с тех пор мы перешли на Win 7, и я столкнулся с этой проблемой, когда у пользователя нет правильное разрешение для просмотра выбранных данных. Я добавил необходимые изменения, чтобы приложение работало под IIS 7, включая добавление HttpModule в раздел <system.webServer><modules>
файла Web.config
. Мне интересно, есть ли что-то еще, что отсутствует?
Вот проблема: у меня есть веб-форма, которая использует объект ObjectDataSource, который вызывает метод GetAppData() в файле кода уровня службы C# для отображения данных пользователю. Файл уровня обслуживания проверяет, имеет ли пользователь правильные разрешения для просмотра данных, а так как они этого не делают, он выдает InvalidPermissionException
. Затем это запускает метод Application_Error для выполнения в моей обработке ошибок HttpModule, который улавливает ошибку и должен перенаправить пользователя на страницу InvalidPermissionError.aspx
; однако вместо этого я вижу страницу ошибок с техническими деталями и трассировкой стека. Как я могу отобразить страницу с удобной для пользователя страницей?
Ниже приведен соответствующий код (я не включил все в):
Рисунок 1: Web Form
<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);
}
Вы правы. Он работает в интегрированном режиме. Я перешел в режим Classic, и это решило проблему. –