Возможно ли иметь "перегруженные" uritemplates?

        [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 ответа

Решение

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

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

Нет, не совсем - потому что строковый параметр 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
   }
   ......
}

Я добился этого с помощью 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);

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

Другие вопросы по тегам