【问题标题】:ASP.NET MVC properly handling invalid URLsASP.NET MVC 正确处理无效 URL
【发布时间】:2012-01-01 11:51:04
【问题描述】:

我正在尝试正确处理并返回此 URL 的 404:http://localhost:2867/dd./xml(注意斜线前的点)

在我当前的实现中,我在 Application_Error 中得到 4 个异常/错误。 Server.GetLastError() 返回的第一个异常是 System.Web.HttpException 而接下来的三个是 null。

我做了一个最低限度的实现来重现这个问题。这是 global.asax.cs 中的代码:

protected void Application_Error(object sender, EventArgs e)
{
  Exception exception = Server.GetLastError();
  Server.ClearError();

  var routeData = new RouteData();
  routeData.Values.Add("controller", "Error");
  routeData.Values.Add("action", "Generic");
  routeData.Values.Add("area", "");

  IController errorController = new ErrorController();
  // this line throws System.Web.HttpException is a view is returned from ErrorController
  errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

错误控制器如下所示:

public class ErrorController : Controller
{
  public ActionResult Generic()
  {
    Response.TrySkipIisCustomErrors = true;
    Response.StatusCode = (int)HttpStatusCode.NotFound;

    return View();
    // returning content rather than a View doesn't fire 'System.Web.HttpException' in Application_Error
    //return Content("Some error!");
  }
}

有两个问题。一种是对于给定的 URL,而不是 Application_Error 中的一个错误,我得到 3 或 4,另一种是当从 ErrorController 返回视图时,Application_Start 中的 Execute 调用行会引发异常。如果返回一个 Content("something") 而不是这个内部(我假设是 MVC)异常不会被触发。

要查看问题,您必须处于调试模式并使用开发服务器。使用 IIS 或 IIS Express 时,由于某种原因未捕获到错误。此外,这些错误有时会消失。要让它回到开始,你必须清理溶液。

如果您想使用它,这是最基本的解决方案:http://dl.dropbox.com/u/16605600/InvalidUrl.zip

感谢您的帮助!

【问题讨论】:

    标签: asp.net-mvc-3 error-handling httpexception file-not-found


    【解决方案1】:

    如果您使用的是 IIS7+,请将其放入 web.config 中:

    <system.webServer>
      <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="404" />
        <error statusCode="404" responseMode="ExecuteURL" path="/Error/PageNotFound" />
      </httpErrors>
    </system.webServer>
    

    (来自How can I properly handle 404 in ASP.NET MVC?的回答)

    如果知道 Application_Error 中发生了什么,我仍然会很高兴。

    【讨论】:

      【解决方案2】:

      您可以通过更改 web.config 中的 customeErrors 部分来处理 404
      还有一个redirectMode attribute,您可以使用它来控制错误页面重定向的性质(并避免302)(阅读here

      <configuration>
        ...
        <system.web>
          <customErrors mode="RemoteOnly" 
                        redirectMode="ResponseRewrite" 
                        defaultRedirect="/ErrorPages/Oops.aspx">
            <error statusCode="404" redirect="/ErrorPages/404.aspx" />
          </customErrors>
      ...
      

      http://www.asp.net/hosting/tutorials/displaying-a-custom-error-page-cs

      在 ASP.net MVC 中,您可以重写一个方法来捕获控制器中抛出的所有异常。只需覆盖Controller.OnException(...),您也可以在其中进行自定义错误处理。如果你所有的控制器都继承自一个通用的基控制器类,你可以把错误处理放在那里。

      http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx

      【讨论】:

      • 如果我没记错的话,可以通过重定向到不同的页面来工作,这不是返回 http 错误的正确方法。
      • 此外,此代码用于除 404 之外的其他应用程序错误。我专注于 404 只是为了表明正在发生一些奇怪的事情。
      • @pbz asp.net 错误处理将自动应用正确的错误状态代码,我不是 100% 清楚为什么它不适合重定向到不同的页面(我有点生疏虽然在我的 http 上...)其他错误可以使用 500 代码处理,我还将添加有关 OnException 控制器方法的详细信息。
      • 当浏览器,尤其是搜索引擎爬虫,向 (GET) 请求 example.com/somepage 时,它希望在标头中有一个 http 代码。如果 URL 正确,则返回代码应为 200,如果不存在则应返回 404 或 410。如果您的页面返回 302(例如重定向到 404 页面),则爬虫会认为该页面已被移动而不是找不到。
      • @pbz 啊,我没有做太多与 SEO 相关的事情,感谢澄清/分享,我添加了一些信息,似乎显示了新的“redirectMode”属性是如何处理的
      猜你喜欢
      • 2010-10-28
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多