Я была поставлена задача реализовать следующее, используя WCF REST:Несколько методов с различными параметрами WCF REST
Resource POST GET PUT DELETE /device Create new device List devices Bulk update devices Delete all devices
Это не проблема, за се, но проблема заключается в том, что все эти функции нужны разные параметры. Например, метод POST принимает WSDevice, тогда как метод GET принимает параметр WSCollectionQuery в качестве параметра (используется для запросов к коллекциям well ..). Все 4 метода принимают разные параметры, но должны быть доступны через /устройство 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.
Я знаю, почему я получаю эту ошибку. Я хотел бы знать, как еще решить эту проблему? Я смотрел, что у меня есть одна функция, принимающая Метод = "*", который работает, но я не могу получить доступ к каким-либо параметрам, отличным от тех, которые были переданы в функции.
Если кто-нибудь знает решение этого или может сказать, что это невозможно, если это не так, это было бы очень, очень ценится!
Редактировать: Я также знаю, что вы не можете передавать сложные типы в GET, но это проблема, с которой можно работать.