2012-06-02 13 views
7

Tôi đang cố gắng tìm hiểu một số WCF theo cách riêng của mình. Tôi có kiến ​​thức về C#/ASP.net nhưng tôi mới tham gia WCF. Tôi đang sử dụng Visual Studio 2010 để phát triển một số ứng dụng trong khi tôi học.WCF - cho phép khách hàng chọn định dạng trả lại

Tôi đã phát triển một dịch vụ web nhỏ hoạt động như phụ trợ cho trình quản lý Tác vụ/TODO nơi người dùng có thể tạo/xóa/chỉnh sửa sự kiện mới; tất cả đều rất đơn giản và cơ bản.

Câu hỏi của tôi như sau:

  1. Có cách nào để cho các khách hàng chọn định dạng lại anh ta muốn (ví dụ xml/json/rdf) mà không cần viết hợp đồng hoạt động mới?
  2. Làm cách nào tôi có thể nhìn thấy trên máy khách thông điệp chính xác mà Dịch vụ Web gửi cho tôi (để tôi có thể kiểm tra xem đó có phải là đại diện json hay một thông báo xml) không.

Trả lời

3

Cách trình duyệt web chọn định dạng phản hồi từ trang web là qua content negotiation và đặc biệt thông qua việc sử dụng các tiêu đề HTTP AcceptContent-Type HTTP.

Ví dụ, nếu khách hàng của bạn đòi hỏi một phản ứng định dạng JSON, nó sẽ gửi các máy chủ một yêu cầu HTTP mà trông giống như sau:

GET /resource HTTP/1.0 
User-Agent: YourClient 1.0 
Accept: application/json 

Các máy chủ, đến lượt nó, sẽ phản ứng với một gói HTTP như thế này:

HTTP/1.0 200 OK 
Content-Type: application/json 
Content-Length: 20 

{ "type" : "json" } 

WCF là tiếc là không được trang bị để xử lý đàm phán nội dung ra khỏi hộp, nhưng có một thư viện của bên thứ ba thực sự thoải mái cho phép nó mà không có quá nhiều công việc gọi là WcfRestContrib. documentation của chúng tôi mô tả các bước (khá đơn giản) mà bạn phải thực hiện để làm cho nó hoạt động. Nói tóm lại, bạn phải

  1. trang trí lớp dịch vụ của bạn theo các loại nội dung bạn muốn hỗ trợ,
  2. trang trí những phương pháp bạn muốn được nội dung đàm phán-aware, và
  3. trở lại một serializable đối tượng kinh doanh từ phương thức đó.

Đối với câu hỏi thứ hai, Fiddler là lựa chọn tốt để kiểm tra cả khách hàng và máy chủ.

+0

Tôi sẽ cung cấp cho WcfRestContrib một cái nhìn sau ngày hôm nay và lấy lại cho bạn. – Morat

1

Kinh nghiệm của tôi là WCF không tuyệt vời trong lĩnh vực này. MVC là một cải tiến lớn với khái niệm "Kết quả hành động" cho phép bạn trả lại bất cứ điều gì bạn muốn cho một điểm cuối đã cho. (Và được cho là "API Web" mới sẽ là cuộc hôn nhân của các tính năng WCF và MVC.)

Điều đó cho biết, cách WCF dễ nhất để khách hàng chọn định dạng phản hồi là xác định loại trả về Luồng. và sắp xếp lại kết quả theo yêu cầu.

Vì vậy, hãy khai báo phương pháp như thế này và sử dụng (các) trình nối tiếp của bạn được chọn cho JSONXML.

[OperationBehavior] 
[WebGet()] 
public Stream SomeOperation(string format) 
{ 
    string test = "Hello world"; 
    string encodedResult; 
    if (format.ToLower() == "xml") { 
     // serialize as XML (eg, XML Serializer) 
     HttpContext.Current.Response.ContentType = "text/xml"; 
    } 
    else if (format.ToLower() == "json") { 
     // serialize as JSON (eg, Newtonsoft Json) 
     HttpContext.Current.Response.ContentType = "application/json"; 
    } 
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(encodedResults)); 
    return ms; 
} 

Đối với câu hỏi thứ hai, tôi khuyên bạn nên sử dụng công cụ miễn phí như Fiddler để kiểm tra phản hồi HTTP thô từ máy chủ.

+0

Cảm ơn bạn đã đề cập đến Fiddler. Sẽ kiểm tra nó ra. Tôi đã không thực sự có được những gì bạn có nghĩa là với "chỉ định một loại trả về chuỗi, và serialize kết quả theo yêu cầu"? Bạn có nghĩa là làm cho tất cả các hợp đồng của tôi trở lại chuỗi và xử lý serialization bản thân mình hoặc? – Morat

+0

@Morat yeah, đó là ý của tôi. Tôi sẽ cập nhật câu trả lời với chi tiết hơn một chút. – McGarnagle

+0

Cảm ơn bạn đã thêm một ví dụ mã; nó rõ ràng hơn bây giờ. Nhưng không mã hóa mọi thứ theo cách bạn đề nghị ngăn tôi lợi dụng tất cả các loại dữ liệu tùy chỉnh mà proxy sẽ cung cấp? Tôi cũng sẽ phải phân tích câu trả lời từ WebService thay vì có các đối tượng sẵn sàng ra khỏi hộp? – Morat

1

Thay vì thực hiện dịch vụ dựa trên SOAP, bạn có thể dùng thử mô hình REST. Các phương pháp mới để tạo ra các dịch vụ REST hoặc HTTP sử dụng công nghệ MS đang sử dụng Web API sẽ có sẵn ASP.NET MVC 4.

Ưu điểm của REST:

  1. Nội dung đàm phán - Khách hàng có thể chỉ định các đĩa dữ liệu nhập (JSON, XML ..) thông qua tham số Accept-Type trong tiêu đề Request.

  2. phương pháp sử dụng HTTP một cách rõ ràng

  3. mục cấu trúc giống như URI

và nhiều hơn nữa ..

9

Khi bạn tạo một dịch vụ REST với WCF, đàm phán nội dung được hỗ trợ.

Bạn chỉ cần đặt automaticFormatSelectionEnabled thành true trên điểm cuối.

Xem thêm: WCF Web HTTP Formatting

+0

Tôi chỉ tìm thấy liên kết tài liệu Microsoft ở trên bản thân mình sau 2 giờ tìm kiếm đau đớn. Câu trả lời này cần nhiều tình yêu và sự chú ý hơn vì nó vượt trội hơn tất cả những người khác. – crush