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

这可能吗 - 如果没有,有人可以提出替代方案吗?

4

3 回答 3

10

我发现这对我来说是最好的解决方案:

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

于 2010-09-09T12:58:31.657 回答
1

不,不是真的——因为字符串参数searchType可以是 NULL——所以你真的没有办法区分这两个 URL 模板。如果您使用的是不可为空的类型,例如 anINT或其他类型,情况会有所不同 - 然后您(和 .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
   }
   ......
}
于 2010-09-09T11:22:47.167 回答
0

我通过使用 STREAM 从客户端传递数据来实现这一点。您甚至可以有 2 个名称相同但方法名称不同的操作。从前端确保将 contentType 设置为“text/javascript”或“application/octet-stream”,如果使用 AJAX 或 jQuery,请尝试从 HTML 或数据变量中以 POST 的形式发送数据

例如

[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

于 2014-06-16T12:14:17.723 回答