我正在创建一个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服务,或者这是不可能的?
答案 0 :(得分:2)
当前在WCF中不支持传递null或空参数,此问题的主要解决方案是覆盖querystringconverter,该querystringconverter在通过管道但在达到操作合同之前处理url。
这里有一个很好的例子来说明querystringconverter的扩展:
<强>无论其强> 遗憾的是,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传递任何内容以证明