我在本地使用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");
答案 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);
}
}
}
}
}