WCF 4:在GET请求上传递Empty参数

时间:2011-01-25 12:30:29

标签: wcf api parameters service optional

我正在创建一个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 个答案:

答案 0 :(得分:2)

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

这里有一个很好的例子来说明querystringconverter的扩展:

  

In the WCF web programming model, how can one write an operation contract with an array of query string parameters (i.e. with the same name)?

<强>无论其 遗憾的是,WCF 4中存在一个错误,你无法覆盖querystringconverter,微软已经解决了这个问题,并将在今年发布的SP1版本中修复。

除非处理异常并返回状态代码400(错误请求),否则没有干净的方法来处理这种情况 - api的良好文档应该在过渡期间处理。

答案 1 :(得分:0)

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

INT? MaxSalary

希望这会有所帮助

答案 2 :(得分:0)

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

答案 3 :(得分: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; }

}

优势(我会很简短,请回复我的详细信息)

  • 服务签名无变化 合同没有改变

  • 你将获得灵活性 空参数

  • 您可以随时扩展数量 参数没有任何影响 现有服务

下面是fiddler的示例输入和输出 注意:在请求部分,我没有故意向NumberOfResults传递任何内容以证明 Fiddler screen shot with sample request and response