2010-05-21 28 views
5

Tôi có dịch vụ WCF và ứng dụng web. Dịch vụ web thực hiện một phương thức SubmitOrders. Phương thức này lấy một tập hợp các đơn đặt hàng. Vấn đề là dịch vụ phải trả về một mảng kết quả cho mỗi đơn đặt hàng - đúng hoặc sai. Đánh dấu các tham số WCF như ra hoặc ref không làm cho cảm giác trở nên rõ ràng. Bạn muốn giới thiệu gì?Thiết kế giao diện WCF: không có tham số out hoặc ref

[ServiceContact] 
public bool SubmitOrders(OrdersInfo) 

[DataContract] 
public class OrdersInfo 
{ 
    Order[] Orders; 
} 
+0

OK.Đây chỉ là sự thiếu hiểu biết của tôi về các thuộc tính WCF. Cảm ơn tất cả các bạn đã trả lời. –

Trả lời

11

Đánh dấu các tham số WCF là không đúng hoặc không có ý nghĩa.

tham số ngoài có ý nghĩa trong WCF.

Bạn sẽ đề xuất điều gì?

Tôi khuyên bạn nên sử dụng các thông số.


Lưu ý 1: Nó sẽ di chuyển tham số ngoài của bạn làm thông số đầu tiên trên bạn.

Lưu ý 2: Có, bạn có thể trả về các đối tượng có các loại phức tạp trong WCF. Gắn thẻ lớp của bạn với thuộc tính [DataContract] và thuộc tính của bạn với thuộc tính [DataMember].

+0

Tôi đồng ý, chúng tôi đã sử dụng chúng rộng rãi trong các dịch vụ của chúng tôi. Bạn cũng có thể đánh dấu phương thức là IsOneWay = False và trả lại một mảng bất kỳ dữ liệu nào bạn muốn cho người gọi thay vì chỉ là một bool. –

+0

Err .. Tôi hiểu rồi. Tôi nghĩ rằng WCF tuần tự hóa lớp học thành các thông điệp và tin nhắn được chuyển đến dịch vụ. Các tham số ngoài giả định một số thông báo sau cho khách hàng - tôi có đúng không? –

+0

Chỉ cần không thêm OneWayAttribute! Mặc định là Request/Response. – Erup

1

Lớp đặc biệt giữ thứ tự và đúng/sai hoặc một loạt các tupels.

2

Vâng, nếu bạn muốn tránh tham số và tham số, bạn luôn có thể trả về một mảng các ID của các đơn đặt hàng đã được gửi thành công.

+1

@Captain: Tôi không chắc chắn về WCF cụ thể, nhưng các dịch vụ SOAP có thể sử dụng các tham số "ngoài". Tôi đoán WCF sẽ hỗ trợ điều đó vì nó có ý nghĩa ít nhất với SOAP và TCP/IP. –

1

Phương pháp này sẽ như thế nào:

public OrdersInfo SubmitOrders(OrderInfo orders){ 
} 

nơi mỗi mục trong orderInfo sẽ có một SubmissionStatusInfo như:

class SubmissionStatusInfo{ 
enum Status { get; set; } 
string Message { get; set; } 
} 

nơi Status : Submitted, Failed, Error, vv
Message: một chuỗi đưa ra một số thông tin bổ sung về trạng thái ...

HTH

+0

Bạn có thể thực hiện FaultException . Đó là "thực hành tốt nhất" khi trả lại lỗi. – Erup

+0

Đúng, điều đó có ý nghĩa hơn ... – Sunny

3

Sử dụng kiểu phức tạp (một lớp khác có thuộc tính DataContract) để đổi lại.

Giống như

[ServiceContact] 
public OrdersResult SubmitOrders(OrdersInfo) 

[DataContract] 
public class OrdersInfo 
{ 
    Order[] Orders; 
} 

[DataContract] 
public class OrdersResult 
{ 
    ..... 
} 

Ngoài ra thêm DataMember trên Order[] Orders;

+0

Không cần thiết phải tạo một obj DataContract khác. Chỉ cần vượt qua tham số. – Erup

+0

Cả hai giải pháp sẽ hoạt động. Nó phụ thuộc từ thiết kế cho dù anh ta muốn có param hoặc trở về loại phức tạp. – Incognito

2

Vâng, nó có ý nghĩa trả lại một tham số ra về hoạt động WCF. Khi trả lời, thông báo SOAP sẽ chứa phần tử được trả về.

Có nội dung tốt trên MSDN về truyền dữ liệu: Specifying Data Transfer in Service Contracts

Ngoài ra, bạn cần phải sử dụng OperationContractAttribute (không ServiceContractAttribute) trên SubmitOrders.

+0

Cảm ơn bạn. Đây chỉ là một lỗi đánh máy Đây không phải là copypaste, tôi đơn giản hóa vấn đề và gõ mã một cách vội vàng. –

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