ASP.NET MVC正确处理无效的URL

时间:2011-11-18 18:20:43

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

我正在尝试正确处理并返回此网址的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

感谢您的帮助!

2 个答案:

答案 0 :(得分: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中发生了什么仍然很好。

答案 1 :(得分:0)

您可以通过更改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