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

Возможно ли это, если нет, может кто-нибудь предложить альтернативу?Возможно ли иметь «перегруженные» uritemplates?

ответ

9

Я обнаружил, что это было самое лучшее решение для меня:

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

это соответствует:

"http://myservice/searchresults/mysearchterm"

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

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

+0

Действительно ли это работает для вас? WCF обычно не допускает двух операций с тем же именем. –

+0

это работало для меня - свойство 'Name' атрибута' OperationContract' отличает два. Однако основным методам по-прежнему нужны разные подписи. – northben

1

Нет, на самом деле нет, потому что параметр строки searchType может быть NULL, поэтому у вас нет способа отличить два шаблона URL. Было бы иначе, если бы вы использовали тип с нулевым значением, например INT или что-то еще - тогда вы (и среда выполнения .NET) могли бы разделить два шаблона URL (исходя из того, присутствует ли INT).

Что вам нужно сделать, это просто проверить, является ли searchType пустым или NULL в вашем методе GetSearchResults и действовать соответствующим образом.

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

и в своей реализации:

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

спасибо - моя проблема: "HTTP: // MyService/SearchResults/SEARCHTERM" или "HTTP: // MyService/SearchResults/SEARCHTERM /", то есть без SearchType часть URL-адреса не будет соответствовать приведенному выше шаблону и возвращает значение 404. Нужно ли по умолчанию использовать параметр searchType? – Pones

+1

@pones: ok - хм .... Я был под впечатлением, что это будет соответствовать этому шаблону. Но, похоже, вам все-таки нужны два шаблона URI. Спасибо, что поделились своими знаниями! –

0

Я достиг этого с помощью STREAM для передачи данных от клиента. Вы можете даже иметь 2 операции с тем же именем, но с другим именем метода. от переднего конца обязательно установите CONTENTTYPE как «текст/JavaScript» ИЛИ «приложение/октет поток», и попытайтесь отправить данные в виде POST из HTML или в variabke данных при использовании AJAX или JQuery

Для примера [ OperationContract] [WebInvoke (Method = "PUT", UriTemplate = "user/id/{id} /", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] string UpdateUser (string id , Поток System.IO.Stream);

[OperationContract] [WebInvoke (метод = "DELETE", UriTemplate = "пользователь/ID/{ID} /", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, Bodystyle = WebMessageBodyStyle.Wrapped)] string DeleteUser (string id);

ИЛИ заменителем PUT и DELETE для GET и POST

Смежные вопросы