2

.Net4.0を使用してRESTfulWCFサービスを作成しています。次の2つのURLが必要です。

/root/document/{ids}?fields={fields}
/root/externaldocument/{ids}?fields={fields}

同じインターフェイスメンバーにマップするには:

Documents GetDocuments(string ids, string fields)

ワイルドカードをリテラルURLセグメントに入れてみました:

    [OperationContract]
    [WebGet(UriTemplate = "/root/*document/{ids}?fields={fields}")]
    Documents GetDocuments(string ids, string fields)

ただし、これは無効であり、次の例外が発生します。

The UriTemplate '/root/*document/{ids}?fields={fields}' is not valid; the 
wildcard ('*') cannot appear in a variable name or literal... Note that a 
wildcard segment, either a literal or a variable, is valid only as the last 
path segment in the template

ワイルドカードセグメントをテンプレートブレースでラップすると、次のようになります。

    [OperationContract]
    [WebGet(UriTemplate = "/root/{*document}/{ids}?fields={fields}")]
    Documents GetDocuments(string ids, string fields)

次に、メソッド引数にそのような入力パラメーターがないため、例外が発生します。

Operation 'GetDocuments' in contract 'IAPIv2' has a UriTemplate that expects a 
parameter named 'DOCUMENTS', but there is no input parameter with that name 
on the operation.

私の回避策は、異なるメソッドを指す2つのエントリを作成し、メソッドに共通の実装を呼び出させることです。

    [OperationContract]
    [WebGet(UriTemplate = "/root/document/{ids}?fields={fields}")]
    Documents GetDocuments(string ids, string fields)

    [OperationContract]
    [WebGet(UriTemplate = "/root/externaldocument/{ids}?fields={fields}")]
     Documents GetExternalDocuments(string ids, string fields)

しかし、これはちょっと醜いようです。

ドキュメントを読みましたが、この点について具体的に説明することができません。WCFでワイルドカードリテラルセグメントを使用する方法はありますか?または、これはWCFでは不可能ですか?

4

1 に答える 1

1

結局のところ、2つのエントリポイントはわずかに異なる機能を持つ必要がありました。そのため、メソッドの入力に使用されたURLをキャプチャする必要がありました。私がやったことは次のとおりでした:

[OperationContract]
[WebGet(UriTemplate = "/root/{source}ocuments/{ids}?fields={fields}")]
DocumentCollection GetDocumentsById(string source, string ids, string fields);

両方のURL:

/root/document/{ids}?fields={fields}
/root/externaldocument/{ids}?fields={fields}

同じURLテンプレートにマップするため、インターフェイスに1つのUriTemplateを持つ1つのエントリのみが必要でした。

「source」入力パラメーターは、2番目のセグメントが「documents」の場合は「d」、2番目のセグメントが「externaldocuments」の場合は「externald」のいずれかをキャプチャします。したがって、この入力パラメーターを検査することにより、メソッドは、使用されたURLに応じて適切に反応できます。メソッドに到達します。

UriTemplateには次のものを使用できなかったことに注意してください。

[WebGet(UriTemplate = "/root/{source}documents/{ids}?fields={fields}")]

この場合、着信URL

/root/document/{ids}?fields={fields}

ソース入力パラメーターに空の文字列( "")が使用されている場合、テンプレートは一致しますが、テンプレートとは一致しません。どうやら、UriTemplateマッチングアルゴリズムでは、一致するためにパラメータキャプチャグループに少なくとも1つの文字が必要です。

于 2012-12-26T22:07:37.967 に答える