【问题标题】:How to get your app to display the correct HTTP error code如何让您的应用显示正确的 HTTP 错误代码
【发布时间】:2012-06-02 12:13:41
【问题描述】:

我正在使用ASP.NET MVC3 并在Windows Server 2003 上运行网站。我试图弄清楚如何处理所有 HTTP 错误。我已经实现了代码,但是当返回 404 错误时,有时会在浏览器中显示 403 错误。

这是我实现的代码:

在我的global.asax.cs

protected void Application_Error(object sender, EventArgs e)
{
     MvcApplication app = (MvcApplication)sender;
     HttpContext context = app.Context;
     Exception exception = app.Server.GetLastError();
     context.Response.Clear();
     context.ClearError();
     HttpException httpException = exception as HttpException;

     RouteData routeData = new RouteData();
     routeData.Values["controller"] = "Error";
     routeData.Values["action"] = "Index";
     routeData.Values["httpException"] = httpException;

     Server.ClearError();

     IController errorController = new ErrorController();
     errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

ErrorController.cs文件:

public class ErrorController : Controller
{
     public ActionResult Index()
     {
          ErrorModel model = new ErrorModel();

          HttpException httpException = RouteData.Values["httpException"] as HttpException;
          int httpCode = (httpException == null) ? 500 : httpException.GetHttpCode();

          switch (httpCode)
          {
               case 403:
                    //Response.StatusCode = 403;
                    model.Heading = "Forbidden";
                    model.Message = "You aren't authorised to access this page.";
                    break;
               case 404:
                    //Response.StatusCode = 404;
                    model.Heading = "Page not found";
                    model.Message = "We couldn't find the page you requested.";
                    break;
               case 500:
               default:
                    Response.StatusCode = 500;
                    model.Heading = "Error";
                    model.Message = "Sorry, something went wrong.  It's been logged.";
                    break;
          }

          Response.TrySkipIisCustomErrors = true;

          return View(model);
     }
}

我的 web.config 中没有设置任何内容。

我希望它在用户尝试访问我的目录(例如 app_code 和类似目录)时显示正确的错误。这可能吗?

当我输入http://localhost:43596/app_code 时,我看到它似乎是一个 404 错误,但它显示 IE 的默认 403 错误页面。如何让我的代码显示正确的 HTTP 错误消息?

我之所以需要这种方式是因为如果用户试图以任何方式破坏网站,我需要记录所有尝试。我希望能够看到谁做错了访问。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    当我输入http://localhost:43596/app_code 然后我看到它 似乎是 404 错误,但它显示了默认的 403 错误页面 即。

    403 有什么问题?

    在万维网上使用的 HTTP 中,403 Forbidden 是一种 HTTP 用户请求网页时 Web 服务器返回的状态码 或服务器不允许他们访问的媒体。其他 话,服务器可以访问,但服务器拒绝允许 访问页面。 Microsoft IIS 在 目录列表被拒绝时也是如此。

    Wikipedia

    当用户尝试访问App_Data 文件夹时,如果您返回 404,则意味着该文件夹在服务器中不存在,但事实是该文件夹可能存在也可能不存在,因为它是一个特殊的文件夹 ASP.NET 不允许任何人访问它并且它是被禁止的,所以我认为在这种情况下返回 403 是完全有效的。

    404 vs 403 when directory index is missing

    http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

    【讨论】:

      【解决方案2】:

      尝试查看 web.config 部分“customErrors”设置“mode=Off”

      <configuration>
       <system.web>
        <customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
      

      【讨论】:

        猜你喜欢
        • 2018-12-07
        • 2016-12-31
        • 2012-02-26
        • 2015-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 1970-01-01
        相关资源
        最近更新 更多