2011-01-25 46 views
0

私は、取得リクエストを使用してデータベースから検索結果を返すAPIを作成しています。オプションのパラメータを渡すことができるようにしようとしていますWCFで簡単)、空である限りパラメータがクエリ文字列に指定されていれば、サービスによって無視されます。WCF 4:GETリクエストで空のパラメータを渡す

しかし、パラメータが空のクエリ文字列を使用している場合、サーバーによって不正なリクエスト(400)が返されます。

maxSalaryとminSalary渡していない値

あなたは、その後、次のWCFサービスを持っていることを、次のクエリ文字列

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

ノートを渡し、お好みのエンドユーザーのポイントを使用します

[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をオーバーライドすることですオペレーション契約。

querystringconverterの延長をimplmentingの優れた例がここに発見された:

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

しかし は悲しげにあなたがquerystringconverterをオーバーライドすることはできませんWCF 4にバグがあり、これはマイクロソフトによって解決されており、今年にリリースされるSP1リリースで修正される予定です。

これまでは例外を処理し、ステータスコード400(悪い要求)を返す以外にこの状況に対処するためのきれいな方法はありません。中間的にはAPIの優れたドキュメントがこれを処理する必要があります。

0

問題を与える整数だけですか?多分あなたはそれらをヌル可能にしてみることができますか?

int? MaxSalary

これはあなたが「-1」に送信し、送信されていないとして、ビジネス・ロジックでそれを扱うことができ

+0

null可能な型は、WCF 4のボックスの外ではサポートされていないため、クエリー・ストリング変換器は現在オーバーロードできません。 - いい答えですが、WCF 4のSP1でこれはうまくいきました – Jay

+0

ああ、それは、毎日のことです。あなたの他の質問に答えて:クエリの変換は、パイプラインの唯一のフックあなたはそれを変更する必要がありますか? OnBeginRequestイベントなどで空のパラメータを削除することはできないでしょうか? – Syg

0

に役立ちます願っています。

+0

これは、違う行動を表現するために偽の情報を渡すこと、つまり何かに似ていないものを作ることを含むので、悪い習慣です。例えば将来、-1を渡したければ、これは完全に間違って解釈されるでしょう。 – Jay

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

} 

契約が

  • を変更しないサービスの署名でメリット(詳細については、私に戻ってpingを実行、短くするつもりです)

    • 変更なしあなたは柔軟性を取得しますof have nullパラメータ

    • あなたは常に 既存のサービス下記

    に影響を与えることなく パラメータの数を拡張することができシオマネキ ノートからのサンプル入力と出力されます:要求部では、私は証明するために意図的にNumberOfResultsには、何も渡さhaventは Fiddler screen shot with sample request and response

  • 関連する問題