Используйте параметр "params string[]" в конечной точке отдыха WCF
Я хотел бы определить OperationContract, который я могу передать любое количество строковых параметров. Значения следует интерпретировать как массив строк. Есть ли возможность использовать этот тип параметра в OperationContract и определить его в UriTemplate?
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{values}")]
void Operations(params string[] values);
}
3 ответа
Вы не должны делать это в операции GET. Операции GET поддерживают параметры только для пути или строки запроса, ни один из которых не подходит для сложных типов, таких как коллекции.
Коллекция должна быть передана как параметр тела с помощью операции POST.
[OperationContract]
[WebInvoke(Method = "POST",
RequestFormat = WebMessageFormat.Json, // or xml
UriTemplate = "operations/xAllTheStrings")]
void Operations(string[] values);
Нет, но для удобства вы можете сделать (расширение) метод для вашего прокси и / или контракта на обслуживание, который бы раскрыл params string array
параметр, и передать его в реальный контракт прокси / сервис как string array
,
Ваш интерфейс контракта на обслуживание - это просто формальный контракт между тем, что сервер примет, и тем, что клиент должен соблюдать. Этот контракт сериализуется в XML в форме wsdl - поэтому любые типы данных, которые появляются в вашем контракте, должны быть выражены в их сериализованной форме в XML.
В вашем случае число аргументов для вашего вызова службы не является четко определенным: оно может иметь 0, 1, 2... и т. Д. Одним из арендаторов ориентации на обслуживание является то, что контракты должны быть явными - что это не является.
Наиболее "идиоматический" подход (в контексте сервис-ориентированного) заключается в следующем:
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{values}")]
void Operations(string[] values);
}
Как предлагается в этом ответе, если вы хотите добавить синтаксический сахар на стороне клиента, вы можете создать метод расширения, который использует params
ключевое слово, чтобы облегчить восприятие на стороне клиента.
РЕДАКТИРОВАТЬ:
Как отметил tom redfern, вышеуказанный контракт не будет работать. Вам нужно будет либо изменить операцию на POST (как показано в ответе Тома), либо сделать строку аргумента с разделителем, который вы распутываете на стороне сервера для создания массива:
[ServiceContract]
public interface IRestService {
[OperationContract]
[WebGet(UriTemplate = "operations/{delimitedValues}")]
void Operations(string delimitedValues);
}