0

我正在创建一个 API,它只使用 get 请求从数据库中返回一些搜索结果,我正在尝试使它可以传递可选参数(使用 WCF 很容易),而且如果参数在只要查询字符串为空,服务就会忽略它们。

但是,如果您有一个带有空参数的查询字符串,它将由服务器返回一个错误的请求(400),例如

使用您选择的最终用户点传递以下查询字符串

http://www.exampleservice.com/basic/?apiKey=1234&noOfResults=3&maxSalary=&minSalary=&ouId=0&keywords=Web+Developer

注意maxSalary 和 minSalary没有传递值

然后,您将拥有以下 WCF 服务:

[OperationContract]
[WebGet(UriTemplate = "basic/?apiKey={apiKey}&noOfResults={noOfResults}&maxSalary={maxSalary}&minSalary={minSalary}&ouId={ouId}&keywords={keywords}", BodyStyle = WebMessageBodyStyle.Bare)]
        public List<SearchResultsDto> BasicSearch(string keywords, string apiKey, int noOfResults, int maxSalary, int minSalary, int ouId)
    {
          //Do some service stuff
    }

这将导致 400 错误,请有人解释一下如何将空参数传递给 WCF 服务,或者这是不可能的?

4

4 回答 4

2

目前在 WCF 中不支持传递 null 或空参数,解决此问题的主要方法是覆盖 querystringconverter,它在 url 通过管道但到达操作合同之前处理它。

在这里可以找到实现查询字符串转换器扩展的一个很好的示例:

在 WCF Web 编程模型中,如何编写带有一组查询字符串参数(即同名)的操作协定?

然而 遗憾的是,WCF 4 中存在一个错误,您无法覆盖 querystringconverter,这已由 Microsoft 解决,并将在今年的 SP1 版本中修复。

在那之前,除了处理异常并返回状态码 400(错误请求)之外,没有其他干净的方法可以处理这种情况——好的 api 文档应该在此期间处理这个问题。

于 2011-02-03T12:16:37.713 回答
0

只是整数给你带来麻烦吗?也许您可以尝试使它们可以为空?

诠释?最高工资

希望这可以帮助

于 2011-01-25T12:39:32.633 回答
0

它可以通过多种方式处理。由于您正在谈论可以具有可选参数的 REST 服务,因此我的建议是这样做。

创建一个将被接受为此方法的参数的 DataObject。

[ServiceContract]
public interface IService1    
{
    [OperationContract]
    [WebGet(RequestFormat=WebMessageFormat.Json)]
    RequestObject BasicSearch(RequestObject apiKey);
}

public class Service1 : IService1
{
    public RequestObject BasicSearch(RequestObject obj)
    {
        //Do some service stuff

        return obj;
    }
}

[DataContract]
public class RequestObject
{      

    [DataMember]
    public string Keywords {get; set;}

    [DataMember]
    public string ApiKey {get; set;}

    [DataMember]
    public int NoOfResults { get; set; }

}

优点(我会很短,请联系我了解详细信息)

  • 服务签名合同不变不变

  • 您将获得具有空参数的灵活性

  • 您始终可以扩展参数的数量,而不会对现有服务产生任何影响

下面是提琴手 注释的示例输入和输出:在请求部分我没有故意向 NumberOfResults 传递任何东西来证明 带有示例请求和响应的 Fiddler 屏幕截图

于 2011-01-26T15:45:37.740 回答
0

您可以发送“-1”,并在您的业务逻辑中将其视为未发送。

于 2011-01-25T14:02:03.367 回答