2010-09-09 19 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); 

Czy to możliwe? Jeśli nie, czy ktoś może zaproponować alternatywę?Czy możliwe jest posiadanie "przeciążonych" tablic rejestracyjnych?

Odpowiedz

9

odkryłem, że było to najlepsze rozwiązanie dla mnie:

[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); 

ten mecz:

"http://myservice/searchresults/mysearchterm"

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

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

+0

Czy to naprawdę działa? WCF zwykle nie zezwala na dwie operacje o tej samej nazwie. –

+0

to działało dla mnie - właściwość 'Name' atrybutu' OperationContract' różnicuje dwa. Jednak podstawowe metody nadal wymagają różnych podpisów. – northben

1

Nie, niezupełnie - ponieważ parametr łańcuchowy searchType może mieć wartość NULL - więc nie można w żaden sposób odróżnić dwóch szablonów adresów URL. Byłoby inaczej, gdybyś używał typu nie podlegającego zerowaniu, takiego jak INT lub coś podobnego - wtedy ty (i środowisko wykonawcze .NET) mogłeś zachować dwa szablony adresów URL oddzielnie (na podstawie tego, czy INT jest obecne, czy też nie).

Należy tylko sprawdzić, czy searchType jest pusta lub NULL w metodzie GetSearchResults i odpowiednio postępować.

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

w swojej realizacji:

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

Dzięki - mój problem jest: "http: // MyService/searchresults/SEARCHTERM" lub "http: // MyService/searchresults/searchterm /" czyli bez searchType część adresu URL nie pasuje do powyższego szablonu i zwraca 404. Czy muszę domyślnie ustawić parametr searchType? – Pones

+1

@pones: ok - hmm .... Miałem wrażenie, że pasuje do tego szablonu. Wygląda jednak na to, że potrzebujesz dwóch szablonów URI. Dzięki za podzielenie się swoimi spostrzeżeniami! –

0

I to osiągnąć za pomocą strumienia przekazać dane z klientem. Można nawet wykonać 2 operacje o tej samej nazwie, ale o innej nazwie metody. od przedniej upewnij się, aby ustawić contentType jako „text/javascript” LUB „application/octet-stream”, i spróbuj wysłać dane jako POST z HTML lub w variabke danych w przypadku korzystania AJAX lub jQuery

Dla przykładu [ OperationContract] [WebInvoke (Metoda = "PUT", UriTemplate = "user/id/{id} /", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] Ciąg UpdateUser (identyfikator ciągu , Strumień System.IO.Stream);

[OperationContract] [WebInvoke (method = "USUŃ" UriTemplate = "użytkownik/ID/{id} /" ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, Nadwozie = WebMessageBodyStyle.Wrapped)] ciąg DeleteUser (id łańcucha);

lub zastępować PUT i DELETE GET i POST dla

Powiązane problemy