2012-04-06 6 views
12

Tôi vừa bắt đầu sử dụng ServiceStack, một thư viện tuyệt vời.ServiceStack và trả lại luồng

Tuy nhiên, tôi có yêu cầu kinh doanh, nơi chúng tôi phải trả lại xml và json trong đó xml phải ở định dạng cụ thể.

Ví dụ, chúng tôi đã có sẵn khách hàng mong đợi xml của định dạng:

<service name="service1" type="audio" .../> 

nên về cơ bản một loạt các thuộc tính.

Tôi biết rằng ServiceStack sử dụng các khái niệm về DTO và sử dụng DataContractSerializer trả về các phần tử xml thay vì trong biểu mẫu ở trên với các thuộc tính xml.

tôi vẫn muốn sử dụng DTOs cho các yêu cầu (đi qua trong application/xml hoặc application/json trong tiêu đề Chấp nhận) và sau đó tôi có thể tạo ra chuỗi xml của riêng tôi hoặc các chuỗi json và sau đó trở về chúng như:

string result = "....xml or json string..."; 
return new MemoryStream(Encoding.UTF8.GetBytes(result)); 

trong đó chuỗi kết quả có thể là chuỗi xml hoặc chuỗi json.

Tôi nhận thấy trong câu trả lời phản hồi Kiểu nội dung dưới dạng văn bản/html.

Với cách tiếp cận tôi đang sử dụng, tôi có vi phạm bất kỳ nguyên tắc REST nào không? Sẽ có vấn đề với Content-Type như hiện tại (text/html) không?

Nếu tôi sử dụng phương pháp này, nó sẽ giải quyết các yêu cầu nghiệp vụ.

Sửa

tôi thấy rằng tôi có thể trở lại một httpResult như:

return new HttpResult(
     new MemoryStream(Encoding.UTF8.GetBytes(result)), "application/xml"); 

mang đến cho đúng content-type.

Vì vậy, đây có phải là cách phù hợp hoặc tôi sẽ gặp sự cố nếu tôi đi xuống tuyến đường này?

Trả lời

17

Có trả lại IHttpResult sẽ cho phép bạn kiểm soát tải trọng chính xác, Kiểu nội dung và các tiêu đề HTTP khác như bạn muốn.

Ngoài ra, bạn không bị giới hạn trả về luồng, tức là bạn có thể sử dụng HttpResult để trả về chuỗi xml có Loại nội dung khác.

Dưới đây là một số liên kết mà tốt hơn chứng minh những gì có thể với các loại ServiceStack trở lại:

Bạn cũng có thể trả về một tập tin tĩnh sử dụng FileInfo đối tượng, với tham số tùy chọn để trả về tệp dưới dạng tệp đính kèm sẽ nhắc người dùng tải xuống tệp thay vì cố gắng xem tệp trong trình duyệt bằng:

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true); 
+0

Cảm ơn sự trợ giúp. –

+0

Có lợi ích nào trong việc trả lại chuỗi chứ không phải luồng không? –

+2

Không, cả hai đều được viết trực tiếp vào HttpResponse OutputStream của ASP.NET. Vì vậy, sử dụng MemoryStream (nếu bạn đã có String trong bộ nhớ), hãy bổ sung thêm chi phí. Nó có ý nghĩa để trả về một chuỗi khi bạn muốn truyền đầu ra (tức là tránh tải toàn bộ phản hồi trong bộ nhớ) – mythz