2013-09-12 6 views
1

Ошибка обработки 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); 
} 

ответ

0

Вы проверили ли пул приложений IIS, используемый для размещения вашего сайта работает в режиме «Integrated Pipeline»?

+0

Вы правы. Он работает в интегрированном режиме. Я перешел в режим Classic, и это решило проблему. –