Возможно ли иметь «перегруженные» uritemplates? - PullRequest
8 голосов
/ 09 сентября 2010
        [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);

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

Ответы [ 3 ]

10 голосов
/ 09 сентября 2010

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

    [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"

1 голос
/ 09 сентября 2010

Нет, не совсем - потому что строковый параметр searchType может быть НЕДЕЙСТВИТЕЛЕН - поэтому у вас нет никакого способа различить два шаблона 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 голосов
/ 16 июня 2014

Я добился этого с помощью STREAM для передачи данных от клиента.Вы даже можете иметь 2 операции с одним и тем же именем, но с другим именем метода.из внешнего интерфейса убедитесь, что для contentType установлено значение «text / javascript» ИЛИ «application / octet-stream», и попробуйте отправить данные как POST из HTML или в переменную данных, если используете 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 stream);

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

ИЛИ ЗАМЕНА И УДАЛЕНИЕ для GET и POST

...