Возможно ли иметь "перегруженные" 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