2017-02-16 5 views
0

Например, у нас есть простой метод действий, чтобы показать любую книгу с правильным ID:Автоматически выбросить 404 исключение из метода действия, если объект объект является нулевым

public ActionResult GetBook(int id) // id = 123456789 
    { 
     var book = dataManager.Books.GetBookById(id); // == null 
     logger.Info("Getting book with id " + book.Id); 
     return View(book); 
    } 

Если id параметр не действует, мы получаем ошибку 500, потому что нет книги с этим идентификатором.

Мы должны справиться с этой ситуацией вручную, если нам нужно, чтобы бросить сообщение об ошибке 404, как это:

if (book == null) 
     { 
      return HttpNotFound(); 
     } 

Можно ли переключить 500-ошибку 404-ошибки для всех методов действий где-то в веб-приложении (настраиваемый фильтр, конвейер запросов)?

ответ

2

Технически мог бы, установив обработчик ошибок, переписать любую 500 Internal Server Error на 404 Not Found в Application_Error(), как описано в ASP.NET MVC 5 error handling.

Однако, вы, кажется, хотите, чтобы ваш код бросить NullReferenceException на нуль book в book.Id, и превратить это исключение в 404.

Вы действительно не должны делать, что в этом случае, так как это скроет ошибки программирования, потому что вы пропустите исключения, когда это произошло непреднамеренно.

Итак: просто сделайте это прямо там, где вы do ожидайте null. Код, который вы указали, - это именно то, что вам нужно:

if (book == null) 
{ 
    return HttpNotFound(); 
} 
+0

Моя цель - показать ошибку конечного пользователя 404, если он запрашивает несуществующий объект, но должен показать ошибку 500 в любом другом случае. Я не могу понять, можно ли запрограммировать общую версию этой проверки где-то вне класса контроллера (и не копировать этот код в каждом методе действия). – user3172616

+0

Невозможно, чтобы C# знал, что «book.Id» предназначен для выброса исключения «объект не найден», которое вы можете превратить в 404, а для 'someOtherObject.DoSomething()' для создания подлинного 'NullReferenceException' который вы раскрываете как 500. Если у вас есть много методов, которые выглядят одинаково, посмотрите на шаблоны, чтобы уменьшить дублирование. Но это еще один вопрос. – CodeCaster

+0

Спасибо! Я думаю то же самое. Я использую инжекторы зависимостей, метод EF-кодов, все мои сущности, полученные из класса EntityBase. Таким образом, я могу поднять любой объект на базу в своем веб-приложении, когда я получу его из базы данных. – user3172616

0

Я нашел это полезным Bulk 301 Redirect

я тест затем бросить 302

try 
{ 
    ------ 
} 
catch 
{ 
    throw new HttpException(302, "not found"); 
} 

поймать исключение в Global.asax и посмотреть редирект CSV файл

protected void Application_Error() 
    { 
     Exception exception = Server.GetLastError(); 

     Response.Clear(); 
     Server.ClearError(); 

     HttpException ex = exception as HttpException; 

     if (ex.GetHttpCode() == 404 || ex.GetHttpCode() == 302 || ex.GetHttpCode() == 500) 
      { 
       Redirect code in the link! 
      } 
    }