2013-05-15 4 views
2

Я была поставлена ​​задача реализовать следующее, используя 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, но это проблема, с которой можно работать.

ответ

0

Вероятно, лучшим решением в данном случае является использование точно такой же UriTemplate для всех 4-х методов:

UriTemplate = "/v" + REST_API_VERSION + "/device/?device={device}&collectionQuery={collectionQuery}&devices={devices}" 

Затем вы можете проверить наличие необходимого параметра в каждом конкретном случае.

Понятно, почему это не бросает двусмысленное исключение, однако меня бьет.

Смежные вопросы