0

getリクエストを使用してデータベースから検索結果を返すAPIを作成しています。オプションのパラメーターを渡すことができるように(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

現在、nullまたは空のパラメーターの受け渡しはWCFでサポートされていません。この問題の主な解決策は、URLがパイプを通過するときに、操作コントラクトに到達する前にURLを処理するquerystringconverterをオーバーライドすることです。

querystringconverterの拡張を実装する優れた例は、次のとおりです。

WCF Webプログラミングモデルでは、クエリ文字列パラメーターの配列(つまり同じ名前)を使用して操作コントラクトを作成するにはどうすればよいですか?

ただし、残念ながら、WCF 4には、 querystringconverter をオーバーライドできないバグがあります。これは、Microsoftによって対処されており、今年のSP1リリースで修正される予定です。

それまでは、例外を処理してステータスコード400(不正なリクエスト)を返す以外に、この状況に対処するためのクリーンな方法はありません。APIの適切なドキュメントで、暫定的にこれを処理する必要があります。

于 2011-02-03T12:16:37.713 に答える
0

「-1」を送信して、ビジネスロジックで送信されていないものとして扱うことができます。

于 2011-01-25T14:02:03.367 に答える
0

それはあなたに問題を与える整数だけですか?たぶん、それらをnull許容にすることを試みることができますか?

int?MaxSalary

お役に立てれば

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

}

利点(短くなります、詳細については私に連絡してください)

  • サービス署名契約の変更は変更されません

  • nullパラメータを持つ柔軟性が得られます

  • 既存のサービスに影響を与えることなく、いつでもパラメータの数を拡張できます

以下は、フィドラーノートからの入力と出力のサンプルです 。リクエスト部分では、証明するために意図的にNumberOfResultsに何も渡していません。 サンプルのリクエストとレスポンスを含むフィドラーのスクリーンショット

于 2011-01-26T15:45:37.740 に答える