Как определить атрибуты для загрузки данных в веб-службу REST, реализованную через службу WCF?

#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"...)] .