2010-09-09 31 views
8
 [OperationContract] 
    [WebGet(UriTemplate = "/searchresults/{searchTerm}/{searchType}", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] 
    Message GetSearchResults(string searchTerm, string searchType); 

    [OperationContract] 
    [WebGet(UriTemplate = "/searchresults/{searchTerm}", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] 
    Message GetSearchResults(string searchTerm); 

Điều này có thể - nếu không, ai đó có thể đề xuất giải pháp thay thế không?Có thể có "uritemplates" quá tải không?

Trả lời

9

tôi đã tìm thấy rằng đây là giải pháp tốt nhất đối với tôi:

[OperationContract(Name = "SearchresultsWithSearchType")] 
    [WebGet(UriTemplate = "/searchresults/{searchTerm}/{searchType=null}", 
    ResponseFormat = WebMessageFormat.Xml)] 
    Message GetSearchResults(string searchTerm, string searchType); 


    [OperationContract(Name = "SearchresultsWithoutSearchType")] 
    [WebGet(UriTemplate = "/searchresults/{searchTerm}", 
    ResponseFormat = WebMessageFormat.Xml)] 
    Message GetSearchResults(string searchTerm); 

này phù hợp:

"http://myservice/searchresults/mysearchterm"

"http://myservice/searchresults/mysearchterm/"

"http://myservice/searchresults/mysearchterm/mysearchtype"

+0

Điều này thực sự có hiệu quả với bạn không? WCF thường không cho phép hai hoạt động có cùng tên. –

+0

nó đã làm việc cho tôi - thuộc tính 'Name' của thuộc tính' OperationContract' phân biệt hai. Tuy nhiên, các phương thức cơ bản vẫn cần chữ ký khác nhau. – northben

1

Không, không thực sự - vì tham số chuỗi searchType có thể là NULL - vì vậy bạn không thực sự có bất kỳ cách nào để phân biệt hai mẫu URL. Nó sẽ khác nếu bạn đang sử dụng một loại không nullable, như một INT hoặc một cái gì đó - sau đó bạn (và thời gian chạy .NET) có thể giữ hai mẫu URL ngoài (dựa trên thực tế có hay không INT hiện diện).

Những gì bạn cần làm chỉ là kiểm tra xem searchType có trống hay NULL trong phương thức GetSearchResults của bạn và hành động tương ứng.

[OperationContract] 
[WebGet(UriTemplate = "/searchresults/{searchTerm}/{searchType}", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] 
Message GetSearchResults(string searchTerm, string searchType); 

và trong việc thực hiện của bạn:

public Message GetSearchResults(string searchTerm, string searchType) 
{ 
    if(!string.IsNullOrEmpty(searchType)) 
    { 
     // search with searchType 
    } 
    else 
    { 
     // search without searchType 
    } 
    ...... 
} 
+0

Cảm ơn - vấn đề của tôi là: "http: // MyService/searchresults/searchterm" hoặc "http: // MyService/searchresults/searchterm /" có nghĩa là nếu không có sự Kiểu Tìm một phần của URL sẽ không khớp với mẫu ở trên và trả về 404. Tôi có cần phải mặc định tham số searchType không? – Pones

+1

@pones: ok - hmm .... Tôi đã bị ấn tượng rằng nó sẽ khớp với mẫu đó. Nhưng dường như bạn cần hai mẫu URI sau khi tất cả. Cảm ơn bạn đã chia sẻ thông tin chi tiết của mình! –

0

tôi đạt được điều này bằng cách sử dụng STREAM để truyền dữ liệu từ khách hàng. Bạn thậm chí có thể có 2 hoạt động có cùng tên nhưng tên phương thức khác nhau. từ cuối phía trước chắc chắn để thiết lập contentType là "text/javascript" OR "application/octet-stream", và thử gửi dữ liệu như POST từ HTML hoặc trong dữ liệu variabke nếu sử dụng AJAX hoặc jQuery

Ví dụ [ OperationContract] [WebInvoke (Phương thức = "PUT", UriTemplate = "người dùng/id/{id} /", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] chuỗi UpdateUser (chuỗi id , System.IO.Stream stream);

[OperationContract] [WebInvoke (Method = "DELETE", UriTemplate = "user/id/{id} /", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, bodystyle = WebMessageBodyStyle.Wrapped)] chuỗi DeleteUser (chuỗi id);

HOẶC PUT thay thế và DELETE cho GET và POST

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