IT TIP

HttpResponseMessage와 HttpResponseException의 차이점은 무엇입니까?

itqueen 2020. 12. 15. 20:37
반응형

HttpResponseMessage와 HttpResponseException의 차이점은 무엇입니까?


두 가지를 모두 이해하고 샘플 코드를 작성하려고했습니다.

 public HttpResponseMessage Get()
 {
     var response = ControllerContext.Request
                         .CreateResponse(HttpStatusCode.BadRequest, "abc");

     throw new HttpResponseException(response);
 }

과:

 public HttpResponseMessage Get()
 {
     return ControllerContext.Request
                        .CreateResponse(HttpStatusCode.BadRequest, "abc");
 }

Fiddle에서 실제로 차이점을 보지 못했는데 사용 목적은 무엇 HttpResponseException입니까?


둘의 주요 차이점은 이것입니다. 예외는 즉시 처리를 중지하고 종료하는 데 유용합니다. 예를 들어 다음 코드가 있다고 가정합니다.

public class CustomerController : ApiController {
  private ICustomerContext repo;

  public CustomerController(ICustomerContext repo) {
    this.repo = repo;
  }

  public Customer Get(int id) {
    var customer = repo.Customers.SingleOrDefault(c=>c.CustomerID == id);
    if (customer == null) {
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
    }
    return customer;
  }
}

이 코드가 실행되고 존재하지 않는 ID를 전달하면 즉시 처리가 중지되고 404 상태 코드가 반환됩니다.

대신 HttpResponseMessage를 반환하면 요청은 나머지 처리를 기꺼이 계속하고 404를 반환합니다. 가장 큰 차이점은 요청을 종료하는지 여부입니다.

Darrel이 말했듯이 예외는 어떤 경우에는 처리를 계속하기를 원하는 경우 (고객이 발견 될 때와 같이) 다른 경우에는 그렇지 않은 경우에 유용합니다.

HttpResponseMessage와 같은 것을 사용할 수있는 곳은 Http POST에서 상태 코드 201을 반환하고 위치 헤더를 설정합니다. 이 경우 처리를 계속하고 싶습니다. 이 코드를 사용하면됩니다. *

public class CustomerController : ApiController {
  private ICustomerContext repo;

  public CustomerController(ICustomerContext repo) {
    this.repo = repo;
  }

  public HttpResponseMessage Post(Customer customer) {
    repo.Add(customer);
    repo.SaveChanges();
    var response = Request.CreateResponse(HttpStatusCode.Created, customer);
    response.Headers.Location = new Uri(Request.RequestUri, string.format("customer/{0}", customer.id));
    return response;
  }
}

* 참고 : 베타 비트를 사용하는 경우 새 HttpResponseMessage를 생성합니다. 그러나 요청에서 CreateResponse 확장 메서드를 사용해야하는 이후 비트를 사용하고 있습니다.

위에서는 상태 코드를 201로 설정하고 고객에게 전달한 다음 위치 헤더를 설정하는 응답을 작성하고 있습니다.

그런 다음 응답이 반환되고 요청이 처리를 계속합니다.

도움이 되었기를 바랍니다


HttpResponseException은 컨트롤러 작업 서명이 다음과 같을 때 유용합니다.

  Foo Get(int id)

이 경우 400과 같은 상태 코드를 쉽게 반환 할 수 없습니다.

Be aware that HttpResponseMessage<T> is going away in the next release of Web API.


Assuming you want to unit test the responses, doesn't it make sense to always return an HttpResponseMessage? I don't particularly like the idea of returning a straight type from an ApiController since it doesn't follow typical development patterns.

In a non-Web API class that fetched a Customer, you'd likely return null, with your calling code checking for a null response:

public Customer GetCustomer(int id)
{
    return db.Customers.Find(id);
}

But in Web API, you're not going to return null, you have to return something, even if that something is created after you throw an HttpResponseException. In that case, to ease testing, why not just always return an HttpResponseMessage, and make that your signature?

public HttpResponseMessage GetCustomer(int id)
{
    var customer = db.Customers.Find(id);
    if (customer == null)
    {
        return Request.CreateResponse(HttpStatusCode.NotFound);
    }

    return Request.CreateResponse(HttpStatusCode.OK, customer);
}

HttpResponseException derives from Exception and embeds HttpResponseMessage. Since it derives from Exception it can be useful in try-catch scenarios.

Default status code returned by HttpResponseException is HttpStatusCode.InternalServerError.


As the original questions states, there is no real difference in the returned Response.

The real purpose of HttpResponseException is to allow sub methods to create and 'throw' their own HttpResponseMessages that flow back to the up the call stack and are returned to the client.

public class CustomerController : ApiController {
  private ICustomerContext repo;
  public CustomerController(ICustomerContext repo) {
    this.repo = repo;
  }

  public HttpResponseMessage Get(int id) {

    Customer customer = getCustomer(id);

    return Request.CreateResponse(customer);
  }

  private Customer getCustomer(int id){
    .....do some work
    .....we have a problem so throw exception
    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest, "Id out of range");
    return repo.Customers.SingleOrDefault(c=>c.CustomerID == id)
}

Forgive any mistakes, code written on the fly. The thrown HttpResponseException bubbles up thru the actions call stack, does not get caught by normal Exception handlers and returns its HttpResponseMessage like the action method itself would have.

ReferenceURL : https://stackoverflow.com/questions/10660721/what-is-the-difference-between-httpresponsemessage-and-httpresponseexception

반응형