私は、WCF REST を使用して以下を実装するタスクを与えられました。
リソース POST GET PUT DELETE /device 新しいデバイスの作成 デバイスの一覧表示 デバイスの一括更新 すべてのデバイスの削除
これ自体は問題ではありませんが、問題は、これらすべての関数が異なるパラメーターを必要とすることです。たとえば、POST メソッドはWSDeviceを受け取りますが、GET メソッドはパラメーターとしてWSCollectionQueryを受け取ります (コレクションのクエリに使用されます)。4 つのメソッドはすべて異なるパラメーターを使用しますが、/device Uri からアクセスできる必要があります。
これは REST で可能になるはずです ( http://pages.apigee.com/web-api-design-ebook-thank-you-download.html?aliId=1911411によると、最初にテーブルを取得した場所です。 7ページ参照)。
私が現在持っているもの:
[OperationContract,
WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "/v" + REST_API_VERSION + "/device/?device={device}")]
WSResult DevicePost(String sessionKey, WSDevice device);
[OperationContract,
WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "/v" + REST_API_VERSION + "/device/?collectionQuery={collectionQuery}")]
WSResult DeviceGet(String sessionKey, WSCollectionQuery collectionQuery);
[OperationContract,
WebInvoke(Method = "PUT",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "/v" + REST_API_VERSION + "/device/?devices={devices}")]
WSResult DevicePut(String sessionKey, WSDevice[] devices);
[OperationContract,
WebInvoke(Method = "DELETE",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "/v" + REST_API_VERSION + "/device/")]
WSResult DeviceDelete(String sessionKey);
したがって、基本的には同じ UriTemplate を使用したいと思いますが、メッセージ本文で渡されたパラメーターに応じて結果が異なります。上記のパラメーターを Uri に追加したことは知っていますが、それは単に Uri を区別するためのものでした。
私が得ているエラーは次のとおりです。
UriTemplateTable does not support multiple templates that have equivalent path as template '/v1/device/?device={device}' but have different query strings, where the query strings cannot all be disambiguated via literal values. See the documentation for UriTemplateTable for more detail.
このエラーが発生する理由はわかっています。私が知りたいのは、この問題を解決する方法は他にありますか? Method = "*"を使用する1 つの関数があることを確認しましたが、関数で渡されたもの以外のパラメーターにアクセスできません。
誰かがこれに対する解決策を知っているか、そうでなければ不可能だと言えるなら、それは大歓迎です!
編集: GET で複雑な型を渡すことができないこともわかっていますが、これは回避できる問題です。