2011-01-25 113 views
0

我正在創建一個只使用get請求從數據庫返回一些搜索結果的API,我試圖讓可選參數可以傳遞(使用WCF也很容易),但是如果參數在查詢字符串中被指定,只要它們是空的,它們將被服務忽略。WCF 4:在GET請求上傳遞空參數

但是,如果您有一個含空參數的查詢字符串,它將返回服務器發出的錯誤請求(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錯誤,請有人解釋如何將空參數傳遞給WC F服務還是這是不可能的?

回答

2

目前傳遞null或空參數在WCF支持,解決這一問題的主要解決方案是要覆蓋處理的URL querystringconverter,因爲它涉及通過管道,但之前到達es運營合同。

implmenting的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的良好文檔應該在此期間處理此問題。

0

它只是整數給你帶來麻煩嗎?也許你可以嘗試讓它們爲空?

int? MaxSalary

希望這有助於

+0

使用WCF 4不支持可空類型,並且目前querystringconverter不能被重載。 - 不錯的答案,雖然WCF 4的SP1,這將工作 – Jay 2011-02-03 12:07:45

+0

啊比thanx,每天都是schoolday ;-)。爲了迴應你的其他問題:querystring轉換器是唯一需要修改的管道鉤子嗎?是不是可以刪除OnBeginRequest事件中的空參數? – Syg 2011-02-11 08:46:35

0

你可以在發送「-1」,並把在你的業務邏輯不發送。

0

它可以用多種方式處理。既然你正在談論一個可以有可選參數的REST服務,我的建議就是做這樣的事情。

創建一個數據對象,該數據對象將作爲該方法的參數被加入。

[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; } 

} 

優勢(我要短,ping命令我回去瞭解詳細信息)

  • 服務簽名無變化 合同不改變

  • 您將獲得靈活有 空參數

  • 你總是可以不受任何影響延長 參數的數目 現有服務

下面

是樣本輸入和輸出提琴手 注:在請求部分我還沒有傳遞什麼NumberOfResults有意證明 Fiddler screen shot with sample request and response