2013-07-31 38 views
38

Tôi có một bộ điều khiển MVC API với hành động sau.Cách lấy dữ liệu HttpRequestMessage

Tôi không hiểu cách đọc dữ liệu/nội dung thực của Thư?

[HttpPost] 
public void Confirmation(HttpRequestMessage request) 
{ 
    var content = request.Content; 
} 
+1

Bạn nhận được gì từ 'request.Content'? – Mansfield

+0

Tôi thấy tất cả tiêu đề và độ dài nội dung, nhưng dữ liệu ở đâu? – user1615362

Trả lời

60

Từ this answer:

[HttpPost] 
public void Confirmation(HttpRequestMessage request) 
{ 
    var content = request.Content; 
    string jsonContent = content.ReadAsStringAsync().Result; 
} 
+1

Từ quan điểm của nhà phát triển, sử dụng đồng bộ có thể không phải là một lựa chọn tốt hơn trong trường hợp nếu bạn muốn gỡ lỗi hoặc đợi cho đến khi thao tác hoàn tất để xem dữ liệu. – Kurkula

+5

52 phiếu bầu cho một giải pháp gây tắc nghẽn tiềm ẩn có thể có nghĩa là có * nhiều * mã không đồng bộ không chính xác nổi xung quanh đó. Luôn sử dụng async/await trong trường hợp này. –

+0

Mọi người, vui lòng đọc nhận xét của @ ToddMenier: KHÔNG sử dụng mã này trong quá trình sản xuất. Nó xuất hiện trong mã của chúng tôi và đã bế tắc. – makhdumi

12

tôi đề nghị rằng bạn không nên làm điều đó như thế này. Phương pháp hành động nên được thiết kế để dễ dàng kiểm tra đơn vị. Trong trường hợp này, bạn không nên truy cập dữ liệu trực tiếp từ yêu cầu, bởi vì nếu bạn làm như thế này, khi bạn muốn đơn vị kiểm tra mã này, bạn phải xây dựng một HttpRequestMessage.

Bạn nên làm điều đó như thế này để cho MVC làm tất cả những mô hình liên kết cho bạn:

[HttpPost] 
public void Confirmation(YOURDTO yourobj)//assume that you define YOURDTO elsewhere 
{ 
     //your logic to process input parameters. 

} 

Trong trường hợp bạn không muốn để truy cập yêu cầu. Bạn chỉ cần truy cập thuộc tính Request của controller (không phải thông qua các tham số). Như thế này:

[HttpPost] 
public void Confirmation() 
{ 
    var content = Request.Content.ReadAsStringAsync().Result; 
} 

Trong MVC, thuộc tính Yêu cầu thực sự là trình bao bọc .NET HttpRequest và kế thừa từ lớp cơ sở. Khi bạn cần kiểm tra đơn vị, bạn cũng có thể thử đối tượng này.

+0

Và trong trường hợp bạn có HttpGet? Nếu tôi sử dụng Request.Content.ReadAsStringAsync(). nó không hoạt động! – ayasha

+0

@ayasha: với HttpGet, các tham số phải đến từ chuỗi truy vấn thay vì phần thân yêu cầu. –

+0

@ayasha: Tôi cũng đã cập nhật câu trả lời. Chỉ cần nhận ra nó đã không hoạt động trước –

16
System.IO.StreamReader reader = new System.IO.StreamReader(HttpContext.Current.Request.InputStream); 
    reader.BaseStream.Position = 0; 
    string requestFromPost = reader.ReadToEnd(); 
+5

Điều này làm việc cho tôi trong khi câu trả lời được chấp nhận thì không. – Jerther

+0

Request.Content là một luồng. Tùy thuộc vào thời điểm mã của bạn chạy chính xác, luồng có thể đã được tiêu thụ. – stannius

+0

Điều này phù hợp với MVC, trong khi câu trả lời được chấp nhận cho Web Api chỉ – Sel

Các vấn đề liên quan