在IIS 7.5和IIS 7上显示自定义错误页面

时间:2011-10-11 14:22:20

标签: asp.net iis iis-7 iis-7.5

我在本地使用Asp.net 4 C#和IIS 7,在生产服务器上使用IIS 7.5。

我需要显示自定义错误页面。目前我在Global.asax中使用一些逻辑来绕过IIS默认页面。 在本地使用IIS 7我能够成功显示CustomPages但在生产(IIS 7.5)服务器默认IIS页面仍然存在。 我使用Response.TrySkipIisCustomErrors = true;但在Production Server上不起作用。

你能指出我解决这个问题吗?

我在Global.Asax

中的代码
Application_Error

Response.TrySkipIisCustomErrors = true;
                if (ex is HttpException)
                {
                    if (((HttpException)(ex)).GetHttpCode() == 404)
                    {

                        Server.Transfer("~/ErrorPages/404.aspx");
                    }
                }
                // Code that runs when an unhandled error occurs.
                Server.Transfer("~/ErrorPages/Error.aspx");

1 个答案:

答案 0 :(得分:2)

我做的方式是在一个模块而不是Global.asax中,并将其连接到标准的自定义错误内容中。试一试:

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

    public void Init(HttpApplication context)
    {
        context.Error += new EventHandler(context_Error);
    }

    private void context_Error(object sender, EventArgs e)
    {
        var context = HttpContext.Current;

        // Only handle 404 errors
        var error = context.Server.GetLastError() as HttpException;
        if (error.GetHttpCode() == 404)
        {
            //We can still use the web.config custom errors information to decide whether to redirect
            var config = (CustomErrorsSection)WebConfigurationManager.GetSection("system.web/customErrors");

            if (config.Mode == CustomErrorsMode.On || (config.Mode == CustomErrorsMode.RemoteOnly && context.Request.Url.Host != "localhost"))
            {
                //Set the response status code
                context.Response.StatusCode = 404;

                //Tell IIS 7 not to hijack the response (see http://www.west-wind.com/weblog/posts/745738.aspx)
                context.Response.TrySkipIisCustomErrors = true;

                //Clear the error otherwise it'll get handled as usual
                context.Server.ClearError();

                //Transfer (not redirect) to the 404 error page from the web.config
                if (config.Errors["404"] != null)
                {
                    HttpContext.Current.Server.Transfer(config.Errors["404"].Redirect);
                }
                else
                {
                    HttpContext.Current.Server.Transfer(config.DefaultRedirect);
                }
            }
        }
    } 
}