Используйте параметр "params string []" в конечной точке отдыха WCF

c# rest wcf servicecontract operationcontract

837 просмотра

3 ответа

1918 Репутация автора

Я хотел бы определить OperationContract, который я могу передать любое количество строковых параметров. Значения следует интерпретировать как массив строк. Есть ли возможность использовать этот тип параметра в OperationContract и определить его в UriTemplate?

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{values}")]
    void Operations(params string[] values);
}
Автор: rbr94 Источник Размещён: 19.07.2016 08:08

Ответы (3)


1 плюс

9330 Репутация автора

Нет, но для удобства вы можете создать (расширение) метод для вашего прокси и / или контракта на обслуживание, который бы выставлял params string arrayпараметр и передавал его в реальный контракт на прокси / сервис как string array.

Автор: LoekD Размещён: 19.07.2016 08:15

2 плюса

24728 Репутация автора

Решение

Вы не должны делать это в операции GET. Операции GET поддерживают параметры только для пути или строки запроса, ни один из которых не подходит для сложных типов, таких как коллекции.

Коллекция должна быть передана как параметр тела с помощью операции POST.

[OperationContract]
[WebInvoke(Method = "POST", 
           RequestFormat = WebMessageFormat.Json, // or xml
           UriTemplate = "operations/xAllTheStrings")]
void Operations(string[] values);
Автор: tom redfern Размещён: 19.07.2016 08:30

1 плюс

2717 Репутация автора

Ваш интерфейс контракта на обслуживание - это просто формальный контракт между тем, что сервер примет, и тем, что клиент должен соблюдать. Этот контракт сериализуется в XML в форме wsdl - поэтому любые типы данных, которые появляются в вашем контракте, должны быть выражены в их сериализованной форме в XML.

В вашем случае число аргументов для вашего вызова службы не является четко определенным: оно может иметь 0, 1, 2 ... и т. Д. Одним из арендаторов ориентации на обслуживание является то, что контракты должны быть явными - что это не является.

Наиболее «идиоматический» подход (в контексте сервис-ориентированного) заключается в следующем:

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{values}")]
    void Operations(string[] values);
}

Как было предложено в этом ответе , если вы хотите , чтобы добавить некоторые синтаксический сахар на стороне клиента , вы можете создать метод расширения , который делает использовать paramsключевое слово , чтобы сделать на стороне клиента опыт легче переваривается.

РЕДАКТИРОВАТЬ:

Как отметил Том , вышеуказанный контракт не будет работать. Вам нужно будет либо изменить операцию на POST (как показано в ответе Тома ), либо сделать строку аргумента с разделителем, который вы распутываете на стороне сервера для создания массива:

[ServiceContract]
public interface IRestService {
    [OperationContract]
    [WebGet(UriTemplate = "operations/{delimitedValues}")]
    void Operations(string delimitedValues);
}
Автор: Lawrence Размещён: 19.07.2016 08:39
Вопросы из категории :
32x32