2013-10-23 37 views
4

考慮以下幾點:是否有與網頁API CreateResponse <Content>()和CreateResponse()有什麼區別?

[HttpGet] 
    [ActionName("GetContent")] 
    public HttpResponseMessage GetContent(int id) 
    { 
     Content content = _uow.Contents.GetById(id); 
     if (content == null) 
     { 
      var message = string.Format("Content with id = {0} not found", id); 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, message); 
     } 
     else 
     { 
      return Request.CreateResponse(HttpStatusCode.OK, content); 
     } 
    } 

和:

[HttpGet] 
    [ActionName("GetContent")] 
    public HttpResponseMessage GetContent(int id) 
    { 
     try 
     { 
      Content content = _uow.Contents.GetById(id); 
      if (content == null) 
      { 
       throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound)); 
      } 
      return Request.CreateResponse<Content>(HttpStatusCode.OK, content); 
     } 
     catch (Exception ex) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex); 
     } 

    } 

我已經看到了兩個編碼風格。一個使用異常,另一個不使用。一個使用CreateResponse和另一個CreateResponse()。有人能說出使用這些的優點/缺點嗎?就我所見,第二種方法似乎看起來更加完整,但是真的需要使用try/catch來完成這樣簡單的事情嗎?

回答

8

主要好處扔HttpResponseException是當你的操作方法返回一個模型類型,而不是HttpResponseMessage。例如:

public Product Get(int id) 
{ 
    Product p = _GetProduct(id); 
    if (p == null) 
    { 
     throw new HttpResponseException(HttpStatusCode.NotFound); 
    } 
    return p; 
} 

這等同於以下內容:

public HttpResponseMessage Get(int id) 
{ 
    Product p = _GetProduct(id); 
    if (p == null) 
    { 
     return Request.CreateResponse(HttpStatusCode.NotFound); 
    } 
    return Request.CreateResponse(HttpStatusCode.OK, p); 
} 

這是確定選其一的風格。

你不應該趕上HttpResponseException S,因爲點是Web API管線趕上他們並將其轉化爲HTTP響應。在第二個代碼示例中,當您確實希望客戶端收到Not Found(404)時,Not Found錯誤會被捕獲並轉化爲Bad Request錯誤。

較長的答案:

CreateResponse VS CreateResponse<T>無關使用HttpResponseException

CreateResponse返回與沒有消息體的HTTP響應:

public HttpResponseMessage Get() 
{ 
    return Request.CreateResponse(HttpStatusCode.NotFound); 
} 

CreateResponse<T>採用類型T的對象和對象寫入到HTTP響應的主體:

public HttpResponseMessage Get() 
{ 
    Product product = new Product(); 
    // Serialize product in the response body 
    return Request.CreateResponse<Product>(HttpStatusCode.OK, product); 
} 

下一個例子是完全一樣的,但使用類型推斷離開了泛型類型參數:

public HttpResponseMessage Get() 
{ 
    Product product = new Product(); 
    // Serialize product in the response body 
    return Request.CreateResponse(HttpStatusCode.OK, product); 
} 

CreateErrorResponse方法創建其響應體是HttpError對象的HTTP響應。這裏的想法是使用通用的消息格式來進行錯誤響應。調用CreateErrorResponse是基本相同的:

HttpError err = new HttpError(...) 
// Serialize err in the response. 
return Request.CreateResponse(HttpStatusCode.BadRequest, err); 
相關問題