2014-01-16 2 views
2

Я работаю над учебником в «Практическом веб-API ASP.NET» Бадринараянана Лакшмирагавана.Throwing HttpResponseException вызывает необработанное исключение

Я думаю, это предполагает, что некоторые исключения могут быть использованы для отправки типа типа «404 - Not Found» обратно в браузер. Однако я просто получаю обычную программу «crash» (появляется сообщение об ошибке).

Должно быть, я что-то пропустил. Может ли кто-нибудь сказать мне, что это может быть? (здесь есть много похожих вопросов, но я не могу найти его для этого случая).

я ...

"HttpResponseException was unhandled by user code" 

URL используется ...

http://localhost:63694/api/employees/12344

Код ...

public class EmployeesController : ApiController 
{ 
    private static IList<Employee> list = new List<Employee>() 
    { 
     new Employee() { 
     Id = 12347, FirstName = "Joseph", LastName = "Law"} 
    }; 


    // GET api/employees 
    public IEnumerable<Employee> Get() 
    { 
     return list; 
    } 

    // GET api/employees/12345 
    public Employee Get(int id) 
    { 
     var employee = list.FirstOrDefault(e => e.Id == id); 

     if (employee == null) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 

     return employee; 
    } 
} 
+0

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

+0

@G. Стойнев, что ты имеешь в виду. Весь класс контроллера выше. Просто отсутствует пространство имен, использование и определение сотрудника. Какие из них вам нужны? – spiderplant0

+0

Должно быть, я пропустил это как-то :-) В этом случае исключение должно быть преобразовано в HttpMessage, когда оно достигнет конца конвейера. –

ответ

2

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

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

var response = Request.CreateResponse(HttpStatusCode.Notfound); 
return response 

// GET api/employees/12345 
public HttpResponseMessage Get(int id) 
{ 
    HttpResponseMessage response = null; 
    var employee = list.FirstOrDefault(e => e.Id == id); 

    if (employee == null) 
    { 
     response = new HttpResponseMessage(HttpStatusCode.NotFound); 
    } 
    else 
    { 
     response = Request.CreateResponse(HttpStatusCode.OK, employee); 
    } 

    return response; 
} 
+0

спасибо, это похоже на более логичный способ сделать это - возвращать somethign, а не поднимать исключение. – spiderplant0

+1

Для согласованности я считаю, что условие if (employee == null) должно создать ответ так: response = Request.CreateErrorResponse (HttpStatusCode.NotFound, «Employee not found»); – dotnetguy

0

На самом деле, вы могли бы делать то, что отправил 2 других пользователей, но так, как вы делаете это правильно.

Web API Обработка исключений: http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

Однако, если вы работаете в режиме отладки в Visual Studio, VS будет предупреждать вас о необработанных исключений и тому подобное. Однако, если вы не работаете в режиме отладки или при развертывании в IIS, поведение будет работать правильно, и будет отображаться страница с ошибкой 404 Not Found.

Visual Studio просто мешает вам, пытаясь обнаружить и предотвратить все необработанные исключения.

+0

спасибо, я попробовал установить его в режим «выпуска», но все равно получить ошибку. – spiderplant0

+0

Вы начинаете отладчик (кнопка F5/play) или просто компилируете и получаете доступ к вашему сайту? Вы пробовали использовать IIS? – Karhgath