HttpModule - 当OnError命中时,需要将用户重定向到特定页面

时间:2013-11-14 20:17:26

标签: c# asp.net redirect httpmodule ihttpmodule

这是我第一次使用HttpModules。我需要为现有的ASP.NET应用程序创建一种“拖放”解决方案,通过将用户重定向到新的“ErrorFeedback.aspx”页面来提供常见的错误处理。因此,当应用遇到异常时,用户将被重定向到ErrorFeedback.aspx,如果他们需要,他们将能够提供有关错误的反馈。我们目前有大约300个网络应用程序,因此最有希望的“拖放”解决方案是HttpModule。此ErrorFeedback页面将是一个新页面,也将添加到解决方案中。最终,这些组件(DLL和自定义网页)将在Nuget包中结束,但目前需要手动将其复制/粘贴到现有解决方案中。

我听说在模块中进行重定向是不好的做法。在遇到OnError HttpModule时,将用户重定向到特定网页的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用custom error pages in Web.config代替HttpModule。但如果你真的需要重定向,最好使用RewitePath method

这里有一些注意事项:

  1. 当您使用URL重写时,您应该注意SEO。因为您的原始网址会计入SERP。
  2. ASP.NET路由也是一种很好的机制,也是您尝试做的替代方案
  3. 为什么在HttpModule中说重定向不好?有什么特别的原因吗?

答案 1 :(得分:1)

如果您只需要重定向,则最好使用web.config custom error pages。 但是如果你还想做更多的事情,例如记录,而不是你需要使用HttpModule,这样的事情:

public class ErrorManagementModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        //handle context exceptions
        context.Error += (sender, e) => HandleError();
        //handle page exceptions
        context.PostMapRequestHandler += (sender, e) => 
            {
                Page page = HttpContext.Current.Handler as Page;
                if (page != null)
                    page.Error += (_sender, _e) => HandleError();
            };
    }

    private void HandleError()
    {
        Exception ex = HttpContext.Current.Server.GetLastError();
        if (ex == null) return;

        LogException(ex);

        HttpException httpEx = ex as HttpException;
        if (httpEx != null && httpEx.GetHttpCode() == 500)
        {
            HttpContext.Current.Response.Redirect("/PrettyErrorPage.aspx", true);
        }
    }
}