#wcf #rest #webinvoke
#wcf #rest #webinvoke
Вопрос:
Я создал службу WCF, которая возвращает некоторые данные, а также позволяет отправлять некоторые данные. Методы службы следующие:
[OperationContract]
bool UploadStream(Guid key, List<StreamRecord> values);
[OperationContract]
bool RegisterStream(Guid key);
[OperationContract]
StreamCollection GetStreams(Guid key);
Мне нужно реализовать это с помощью интерфейса REST.
Я создал новый интерфейс, IRestService, как показано ниже
[WebInvoke(
Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "/bitpool/{poolKey}/streams")]
BitStreamCollection GetBitStreams(string poolKey);
и это работает нормально (я могу протестировать это в адресной строке браузера, и все в порядке)
Теперь я хочу реализовать также метод загрузки, но я не уверен, как это сделать, я пытался с
[WebInvoke(
Method = "POST",
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "/stream/{streamKey}/records/{values}")]
bool UploadStream(string streamKey, List<StreamRecordEntity> values);
Но когда я пытаюсь получить доступ к службе в браузере, это выдает ошибку
http://localhost:6767/RestServer.svc/
выдает ошибку:
Операция ‘UploadBitStream’ в контракте ‘IRestServerJson’ имеет переменную пути с именем ‘values’, которая не имеет типа ‘string’. Переменные для сегментов пути UriTemplate должны иметь тип ‘string’.
Я думаю, что для POST я не могу определить такой URL, но как мне это сделать?
Кроме того, метод RegisterStream должен проверить, существует ли поток с ключом, и если нет, создайте его и верните true, в противном случае верните false.
Должен ли я определить его как GET (поскольку он должен возвращать результат) или как PUT или POST?
Спасибо
Ответ №1:
Передайте values
в теле POST
запроса, отформатированном в xml, а не в URL. Простой способ проверить это — использовать Fiddler.
Что касается RegisterStream
, оба POST
и PUT
могут возвращать информацию в теле ответа. Вы могли бы использовать POST
и возвращать соответствующий код состояния HTTP в зависимости от действия, предпринятого сервером: 201 Created
если ресурс создан, другой код состояния, который имеет смысл в вашем приложении, если ресурс уже существует.
Вызывающий может определить, был ли ресурс создан или уже существовал, на основе возвращаемого кода состояния HTTP, поэтому bool
возвращаемое значение не потребуется.
Примечание: вы можете использовать [WebGet(...)]
вместо [WebInvoke(Method = "GET"...)]
.