Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between HttpResponseMessage and HttpResponseException

I tried to understand both and write sample code:

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

And:

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

From Fiddle, I really didn't see any differences between them, so what is the purpose of using HttpResponseException?

like image 556
cuongle Avatar asked May 18 '12 22:05

cuongle


People also ask

What is HttpResponseException?

The HttpResponseException type is a special case. This exception returns any HTTP status code that you specify in the exception constructor. For example, the following method returns 404, Not Found, if the id parameter is not valid. C# Copy.

What is the difference between HttpResponseMessage and IHttpActionResult?

IHttpActionResult contains a single method, ExecuteAsync, which asynchronously creates an HttpResponseMessage instance. If a controller action returns an IHttpActionResult, Web API calls the ExecuteAsync method to create an HttpResponseMessage. Then it converts the HttpResponseMessage into an HTTP response message.

What is HttpResponseMessage?

A HttpResponseMessage allows us to work with the HTTP protocol (for example, with the headers property) and unifies our return type. In simple words an HttpResponseMessage is a way of returning a message/data from your action.


2 Answers

HttpResponseException is useful when your Controller Action signature looks like

  Foo Get(int id) 

In this case, you cannot easily return status code like 400.

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

like image 22
Darrel Miller Avatar answered Oct 14 '22 01:10

Darrel Miller


The main difference between the two is this. The exception is useful to immediately stop processing and exit. For example assume I have the following code

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;   } } 

If this code runs and I pass an id that is not present, it will immediately stop processing and return a status code of 404.

If instead I return HttpResponseMessage, the request will happily continue the rest of its processing and return a 404. The main difference being end the request or not.

As Darrel said the exception is useful in cases where in some cases I want processing to continue (as in when customer is found) and in others I don't.

The place where you might want to use something like HttpResponseMessage is in an Http POST to return a status code of 201 and set the location header. In that case I do want processing to continue. That would would do with this code.*

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;   } } 

*note: If you are using the beta bits you would create a new HttpResponseMessage. I am using the later bits however which require you to use the CreateResponse extension method off of the Request.

Above, I am creating a response which sets the status code to 201, passes in the customer, and then sets the location header.

The response is then returned and the request continues processing.

Hope this helps

like image 183
Glenn Block Avatar answered Oct 14 '22 02:10

Glenn Block