2013-06-11 29 views
14

Trong giao diện của tôi, tôi đã khai báo điều này.Không thể sử dụng các tham số tùy chọn khi triển khai giao diện cho WCF

[OperationContract] 
[WebGet] 
String GetStuff(String beep, String boop = "too lazy to type"); 

Tôi đã thực hiện như sau.

String GetStuff(String beep, String boop = "too lazy to type") { ... } 

Nó biên dịch và tải lên làm dịch vụ WCF của tôi. Tuy nhiên, khi tôi sử dụng nó như là một tài liệu tham khảo web và cố gắng thực thi mã dưới đây, tôi nhận được trình biên dịch rên rỉ và khóc về phương pháp không có chữ ký của một tham số duy nhất. Dòng cuối cùng là vấn đề.

Làm cách nào để sau đó tôi có thể là quá lười để nhậptheo mặc định?

ServiceClient client = new ServiceClient(); 
client.GetStuff("blobb", "not lazy"); 
client.GetStuff("blobb"); 
+0

Tại sao không chỉ quá tải phương pháp, và làm cho một phương pháp gọi khác với "boop" cung cấp? – Kippie

+3

Quá tải không hoạt động với WCF. –

+0

@HenkHolterman Nhiều câu trả lời hay tại đây. Bạn sẽ được tốt và đưa lời giải thích đơn giản của bạn như là một câu trả lời vì vậy tôi có thể kiểm tra nó màu xanh lá cây, xin vui lòng. "Def args không được hỗ trợ" là câu trả lời hay nhất cho vấn đề của tôi. :) –

Trả lời

24

Đơn giản: đối số mặc định không được hỗ trợ.

Bằng thiết kế và lý do. Chúng tôi sử dụng C# để viết hợp đồng WCF nhưng đó là một thủ thuật không hợp lý. Không phải mọi tính năng ngôn ngữ C# đều có thể được triển khai trong SOAP, REST hoặc JSon.

14

Bạn có thể thử điều này, quá tải hàm.

[OperationContract] 
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")] 
MyResponse GetData(string filter); 

Sau đó lựa chọn khác là sử dụng một DataContract thay vì nhiều thông số, và thiết lập IsRequired false trên thích hợp DataMember s, như được giải thích trong this question.

1

bạn nên kiểm tra mã được tạo khi thêm tham chiếu dịch vụ.

như mã được tạo ra từ WISDL, nơi mà các chữ ký là (giả):

GetStuff(String , String) 

nó tạo ra mã cho phù hợp, không biết về các thông số tùy chọn. vì vậy, nếu bạn muốn nhận được lười biếng, bạn nên thay đổi lớp proxy được tạo ra hoặc, như @Stephen Borg đề xuất, quá tải chức năng.

3

Tôi nhận được trình biên dịch rên rỉ và khóc về phương pháp không có chữ ký của một tham số duy nhất.

Bắt đầu từ đầu. Trình biên dịch của bạn "rên rỉ" là bởi vì dịch vụ không nhận ra các tham số tùy chọn với các giá trị mặc định, vì vậy nó sẽ chỉ phơi bày phương thức yêu cầu tất cả các tham số. Dựa trên siêu dữ liệu này, bạn tạo proxy máy khách ("Tham chiếu dịch vụ"), cũng không chứa phương thức bạn mong đợi; nó chỉ thấy phương thức dịch vụ hiển thị: một phương thức có chữ ký (String beep, String boop). Vì vậy, đó là lý do tại sao, cuối cùng, bạn nhận được một lỗi biên dịch khi bạn cố gắng gọi một phương thức không tồn tại trên một lớp.

Bây giờ khi bạn gọi phương thức này trên dịch vụ, khách hàng của bạn sẽ phải cung cấp cả hai giá trị. Nếu bạn cung cấp null, dịch vụ sẽ thấy null, vì các giá trị cho các thông số mặc định phải được biên dịch thành người gọi. WCF không hỗ trợ điều đó, vì vậy bạn sẽ chỉ phải tạo quá tải như @StephenBorg đề xuất.

3

Bạn có thể làm điều đó như thế này:

[DataContract] 
public class GetStuffParams 
{ 
    [DataMember] 
    string beep {get; set; } 

    [DataMember] 
    string boop {get; set;} 


    public GetStuffParams() { boop = "too lazy to type"; } 
} 


[OperationContract] 
[WebGet] 
String GetStuff(GetStuffParams stuffParams); 
Các vấn đề liên quan