Как определить атрибуты для загрузки данных в веб-сервис REST, реализованный через сервис WCF? - PullRequest
0 голосов
/ 05 ноября 2011

Я создал службу 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);

и все работает нормально (я могу проверить это из адресной строки браузера, и все в порядке)

Теперь я хочу также реализовать метод Upload, но я не уверен, как это сделать. Я пробовал с

    [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 Ответ

1 голос
/ 05 ноября 2011

Передайте values в теле запроса POST, отформатированного в xml, а не в URL.Простой способ проверить это - использовать Fiddler .

Что касается RegisterStream, то и POST, и PUT могут возвращать информацию в теле ответа.Вы можете использовать POST и возвращать соответствующий код состояния HTTP в зависимости от действия, предпринятого сервером: 201 Created, если ресурс создан, другой код состояния, который имеет смысл в вашем приложении, если ресурс уже существует.

Вызывающий может определить, был ли ресурс создан или уже существовал, на основе возвращенного кода состояния HTTP, поэтому возвращаемое значение bool не потребуется.

Примечание: вы можетеиспользуйте [WebGet(...)] вместо [WebInvoke(Method = "GET"...)].

...