22

WCF 4.0 を使用して REST-ful Web サービスを作成しています。私がやりたいことは、UriTemplate.

たとえば、ユーザーが運転免許証または社会保障番号をキーとして使用して、個人に関する情報を取得できるようにする API があります。私のServiceContract/ インターフェイスでは、次の 2 つのメソッドを定義します。

[OperationContract]
[WebGet(UriTemplate = "people?driversLicense={driversLicense}")]
string GetPersonByLicense(string driversLicense);

[OperationContract]
[WebGet(UriTemplate = "people?ssn={ssn}")]
string GetPersonBySSN(string ssn);

ただし、両方の方法でサービスを呼び出すと、次の例外が発生します。

UriTemplateTable は、テンプレート 'people?ssn={ssn}' と同等のパスを持ち、クエリ文字列が異なる複数のテンプレートをサポートしません。クエリ文字列はリテラル値ですべて明確にすることはできません。詳細については、UriTemplateTable のドキュメントを参照してください。

これを行う方法はありませんかUriTemplates?一般的なシナリオのようです。

どうもありがとう!

4

3 に答える 3

12

私もこの問題に遭遇し、最終的に別の解決策を思いつきました。オブジェクトのプロパティごとに異なるメソッドを持ちたくありませんでした。

私がしたことは次のとおりです。

クエリ文字列パラメーターを指定せずに、サービス コントラクトで URL テンプレートを定義します。

[WebGet(UriTemplate = "/People?")]
[OperationContract]
List<Person> GetPersonByParams();

次に、実装で有効なクエリ文字列パラメーターにアクセスします。

public List<Person> GetPersonByParms()
    {
        PersonParams options= null;

        if (WebOperationContext.Current != null)
        {
            options= new PersonParams();

            options.ssn= WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["ssn"];
            options.driversLicense = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["driversLicense"];
            options.YearOfBirth = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["YearOfBirth"];
        }

        return _repository.GetPersonByProperties(options);
    }

その後、次のような URL を使用して検索できます。

/PersonService.svc/People 
/PersonService.svc/People?ssn=5552
/PersonService.svc/People?ssn=5552&driversLicense=123456

また、クエリ文字列パラメーターを組み合わせて一致させることもできるため、必要なものを使用して、興味のない他のパラメーターを省略できます。クエリ パラメーターを 1 つだけに制限しないという利点があります。

于 2012-12-06T14:38:25.770 に答える
11

または、クエリ文字列の形式を維持する場合は、UriTemplate の先頭に静的クエリ文字列パラメーターを追加すると機能します。例えば:

[OperationContract]
[WebGet(UriTemplate = "people?searchBy=driversLicense&driversLicense={driversLicense}")]
string GetPersonByLicense(string driversLicense);

[OperationContract]
[WebGet(UriTemplate = "people?searchBy=ssn&ssn={ssn}")]
string GetPersonBySSN(string ssn);
于 2012-08-14T20:17:00.660 に答える
8

This postによると、それは不可能です。次のようなことをする必要があります。

[OperationContract]
[WebGet(UriTemplate = "people/driversLicense/{driversLicense}")]
string GetPersonByLicense(string driversLicense);

[OperationContract]
[WebGet(UriTemplate = "people/ssn/{ssn}")]
string GetPersonBySSN(string ssn);
于 2012-01-05T15:11:15.930 に答える