ASP.NET MVC правильно обрабатывает недопустимые URL-адреса


Я пытаюсь правильно обработать и вернуть 404 для этого URL: http://localhost:2867/dd./xml (Обратите внимание на точку перед косой чертой)

В моей текущей реализации я получаю 4 исключения / ошибки в Application_Error. Первое исключение, возвращаемое сервером.GetLastError () - это система.Сеть.HttpException, в то время как следующие три являются нулевыми.

Я сделал минимальную реализацию, чтобы воспроизвести эту проблему. Вот код на глобальном языке.асакс.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 на строке вызова Execute в Application_Start создается исключение. Если содержимое ("что-то") возвращается вместо этого, это внутреннее (для MVC я предполагаю) исключение не запускается.

Чтобы увидеть проблему, вы должны быть в режиме отладки и использовать сервер разработки. При использовании IIS или IIS Express ошибка не поймана по какой-то причине. Кроме того, время от времени эти ошибки уходят. Чтобы вернуть его к началу, вы должны очистить раствор.

Если вы хотите поиграть с ним, вот самое минимальное решение: http://dl.dropbox.com/u/16605600/InvalidUrl.zip

Спасибо за вашу помощь!

2 2

2 ответа:

Если вы используете IIS7+, поместите это в сеть.config работает:

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

(Ответ от Как я могу правильно обращаться с 404 в ASP.NET MVC?)

Все равно было бы неплохо знать, что происходит в Application_Error.

Вы можете обработать 404, изменив раздел customeErrors в интернете.config
Существует также redirectMode атрибут, который можно использовать для управления характером перенаправления страницы ошибки (и избежать 302) (читать здесь)

<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