views:

22

answers:

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

Is this possible - if not, can someone suggest an alternative?

+1  A: 

No, not really - because the string parameter searchType can be NULL - so you don't really have any way to distinguish the two URL templates. It would be different if you were using a non-nullable type, like an INT or something - then you (and the .NET runtime) could keep the two URL templates apart (based on the fact whether or not the INT is present).

What you need to do is just check whether searchType is empty or NULL in your GetSearchResults method, and act accordingly.

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

and in your implementation:

public Message GetSearchResults(string searchTerm, string searchType)
{
   if(!string.IsNullOrEmpty(searchType))
   {
      // search with searchType
   }
   else
   {
      // search without searchType
   }
   ......
}
marc_s
Thanks - my problem is: "http://myservice/searchresults/searchterm" or "http://myservice/searchresults/searchterm/" i.e. without the searchType part of the URL will not match the template above and returns a 404. Do i need to default the searchType parameter?
Pones
@pones: ok - hmm.... I was under the impression it would match that template. But seems you do need the two URI templates after all. Thanks for sharing your insights!
marc_s
+1  A: 

I've found that this was the best solution for me:

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


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

this matches:

"http://myservice/searchresults/mysearchterm"

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

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

Pones