2014-01-16 3 views
2

Badrinarayanan Lakshmiraghavan의 "Practical ASP.NET Web API"자습서를 통해 작업하고 있습니다.HttpResponseException을 발생 시키면 처리되지 않은 예외가 발생합니다.

"404 - 찾을 수 없음"유형의 것을 브라우저로 다시 보내는 데 몇 가지 예외를 사용할 수 있다고 생각합니다. 그러나 나는 그냥 정규 프로그램 "충돌"(오류 메시지가 나타납니다) 받고 있습니다.

내가 놓친 것 같습니다. 아무도 그것이 무엇 일지 말해 줄 수 있습니까? (비슷한 질문이 많이 있지만이 경우에는 하나도 찾을 수 없습니다.) 내가 할

... 사용

"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에서 파생 된 컨트롤러 일 수 있습니다.

Employee 유형의 내용으로 HttpResponseMessage를 반환하는 것이 좋습니다.

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

감사합니다.이 방법은 예외적 인 방법을 사용하는 것보다 좀 더 논리적 인 방법으로 보입니다. – spiderplant0

+1

일관성을 위해 조건 (employee == null)이 응답을 다음과 같이 작성해야한다고 생각합니다. response = Request.CreateErrorResponse (HttpStatusCode.NotFound, "Employee not found"); – dotnetguy

0

사실, 당신은 다른 두 사용자가 무엇을 게시 할 수 있지만, 당신이 그것을하고있는 방법은 올바른 :이 경우이 같은 상태 코드를 통해 더 나은 설정 제어가있다.

웹 API 예외 처리 : 당신은 비주얼 스튜디오에서 디버그 모드에서 실행하는 경우 http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

그러나, VS는 처리되지 않은 예외 등에 대해 경고합니다. 그러나 디버그 모드로 실행하지 않거나 IIS에 배포하는 경우 동작이 제대로 작동하고 404 찾을 수 없음 오류 페이지가 렌더링됩니다.

Visual Studio는 처리되지 않은 모든 예외를 감지하고 방지함으로써 사용자를 방해하고 있습니다.

+0

감사합니다. 'release'모드로 설정하려고 시도했지만 여전히 오류가 발생합니다. – spiderplant0

+0

디버거를 시작하거나 (F5/재생 버튼) 사이트를 컴파일하고 액세스하고 있습니까? IIS에 배포 해 보셨습니까? – Karhgath

관련 문제