2009-01-10 26 views
5

Tôi vẫn đang học về REST và, trong bài kiểm tra của tôi, đã đưa ra kịch bản này mà tôi không biết cách giải quyết.Làm cách nào để thêm dữ liệu mới thông qua dịch vụ REST phản đối dịch vụ kiểu RPC?

Tôi có dịch vụ WCF mẫu hiện có sử dụng LINQ-to-Sql. Một cơ sở dữ liệu cực kỳ đơn giản với một bảng duy nhất có tên là "Nhiệm vụ" có bốn trường: Id, Mô tả, IsCompleted và EnteredDate. (Tôi đã đề cập điều này vì tôi không có hợp đồng dữ liệu được xác định trong bản thân dịch vụ, tất cả đều xuất phát từ bối cảnh được tạo bởi LINQ.)

Thu thập dữ liệu không đáng kể để chuyển sang REST ... Tuy nhiên, việc chèn các bản ghi mới không có vẻ dễ dàng.

RPC-Phong cách của tôi hoạt động hợp đồng trông như thế này:

[OperationContract] 
    void AddTask(string description); 

Id, IsCompleted, và EnteredDate không cần thiết như việc thực hiện dịch vụ trông như thế này:

public void AddTask(string description) 
    { 
     TaskListLinqDataContext db = new TaskListLinqDataContext(); 
     Task task = new Task() 
      { Description = description, IsCompleted = false, 
      EntryDate = DateTime.Now }; 

     db.Tasks.InsertOnSubmit(task); 
     db.SubmitChanges(); 
    } 

Id là một Danh tính và do đó được xử lý bởi cơ sở dữ liệu.

Suy nghĩ đầu tiên của tôi là để trang trí hợp đồng hoạt động như thế này:

[WebInvoke(Method="PUT", UriTemplate="tasks/{description}")] 
    [OperationContract] 
    void AddTask(string description); 

Nhưng tôi thực sự không biết làm thế nào để có được điều này để làm việc. Khi tôi thử sử dụng Fiddler để thêm nó, nó trả về kết quả là 411 (Độ dài bắt buộc).

Cách thích hợp để thực hiện việc này là gì? Tôi có phải viết lại quá trình triển khai để chấp nhận toàn bộ tài liệu XML đại diện cho bản ghi mới không?

Trả lời

3

Kết quả:

Cuối cùng tôi đã tìm thấy một nice blog post đã giúp tôi giải quyết vấn đề này. Nó chỉ ra rằng tôi đã làm khá nhiều việc một cách chính xác nhưng tôi đã đưa thử nghiệm vào Fiddler không đúng cách. Tôi cũng đã thêm một vài chi tiết nữa vào thuộc tính của mình.

[WebInvoke(RequestFormat = WebMessageFormat.Xml, 
      ResponseFormat = WebMessageFormat.Xml, 
      Method = "POST", UriTemplate = "tasks/{description}", 
      BodyStyle = WebMessageBodyStyle.Bare)] 
[OperationContract] 
void AddTask(string description); 

Khi tôi đặt Uri của tôi vào Fiddler nó cần thiết để trông như thế này:

http://ipv4.fiddler:8054/tasks/this+is+a+sample+desc+that+works

Bây giờ dịch vụ của tôi chấp nhận một cách chính xác các dữ liệu và có thể thêm nhiệm vụ cho các cơ sở dữ liệu.

0

Tôi nghĩ rằng this mô tả khá nhiều cách thêm mục vào vùng chứa theo cách an toàn.

+0

@thaggie: liên kết đính kèm cho tôi biết rằng UriTemplate và hoạt động của tôi có thể hợp lệ, nhưng không giúp tôi giải quyết được vấn đề của mình. Tôi không biết cách đưa dữ liệu vào dịch vụ đúng cách. Ví dụ, loại Trình xây dựng yêu cầu nào sẽ Fiddler sử dụng để lấy dữ liệu vào dịch vụ? –

0

Tùy thuộc vào yêu cầu, bạn có thể chỉ cần bật CRUD thông thường qua Astoria? Tôi có một loạt bao gồm làm thế nào để làm điều này với LINQ-to-SQL here. Chỉ là một ý nghĩ.

+0

Điều này thật thú vị vì tôi chưa thấy ADO.NET Data Services. Tuy nhiên, nó có vẻ như công việc nhiều hơn những gì tôi đang tìm kiếm. Có vẻ như tôi sẽ có thể làm những gì tôi đã làm việc bằng cách nào đó, hoặc có thể thay đổi chữ ký một số. –

0

Nếu bạn muốn thực hiện dịch vụ web RESTful thì không sử dụng ứng dụng WCF. Sửa đổi mẫu URI của bạn thành một cái gì đó như Task/new và đưa dữ liệu của nhiệm vụ mới vào phần thân của yêu cầu POST http. Tôi thực hiện các dịch vụ web RESTful trong ASP.NET như các trình xử lý chung (* .ashx). Điều này cho phép tôi sẵn sàng phương pháp http và đi từ đó.

kevin

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