2012-04-27 30 views
8

Tôi đang cố trả lại Mã trạng thái HTTP 201 Created cho hoạt động RESTful POST bằng ASP.NET Web API, nhưng Tôi luôn nhận được 200 OK.Không thể lấy API ASP.NET 4 Web để trả lại Mã trạng thái "201 - Đã tạo" cho POST thành công

Tôi hiện đang gỡ lỗi trên IIS 7.5.7600.16385, VS 2010 Professional, Windows 7 64-bit Professional.

public MyResource Post(MyResource myResource) 
{ 
    MyResource createdResource; 
    ... 
    HttpResponse response = HttpContext.Current.Response; 
    response.ClearHeaders(); // added this later, no luck 
    response.ClearContent(); // added this later, no luck 
    response.StatusCode = (int)HttpStatusCode.Created; 
    SetCrossOriginHeaders(response); 
    return createdResource; 
} 

Tôi đã xem các ví dụ khác trong đó HttpContext.Current.Response.StatusCode được đặt trước khi trả về dữ liệu, vì vậy tôi không nghĩ đây có thể là vấn đề. Tôi chưa theo dõi nó trong nguồn MVC 4.

(Điều này có liên quan đến cuộc điều tra của tôi với this question nhưng khác nhau đủ để đảm bảo chủ đề câu hỏi riêng của mình)

Tôi không chắc chắn cho dù vấn đề là IIS hoặc API Web. Tôi sẽ làm thêm các xét nghiệm để thu hẹp nó.

Trả lời

9

HttpContext.Current là một sự nôn nao từ quá khứ.

Bạn cần phải xác định phản ứng như HttpResponseMessage<T>:

public HttpResponseMessage<MyResource> Post(MyResource myResource) 
{ 
    .... // set the myResource 
    return new HttpResponseMessage<MyResource>(myResource) 
      { 
       StatusCode = HttpStatusCode.Created 
      }; 
} 

CẬP NHẬT

Như bạn có thể nhận thấy từ các ý kiến, phương pháp này làm việc với beta phát hành. Không phải RC.

+1

Cảm ơn! Điều đó đã làm điều đó. Tôi thực sự chỉ trả lại HttpResponseMessage để tôi có thể trả về loại nội dung khác nhau nếu cần thiết, nhưng ngay lập tức HttpResponseMessage khi cần, cũng sẽ xử lý câu hỏi liên quan của tôi http://stackoverflow.com/questions/10336733/different-return-types -for-asp-net-mvc-4-web-api. – MikeJansen

+2

@MikeJansen Đừng quá quen với HttpResponseMessage của T vì nó sẽ biến mất trong các bản dựng sau này. Xem http://aspnetwebstack.codeplex.com/discussions/350492 –

+1

@DarrelMiller - cảm ơn, tôi đã chuyển đổi thành HttpRequestMessage.CreateResponse ()! Không thể sử dụng – MikeJansen

-1

Hãy thử điều này:

return Request.CreateResponse<MyResource>(HttpStatusCode.Created, createdResource); 
Các vấn đề liên quan