В модели веб-программирования WCF можно написать рабочий контракт с массивом параметров строки запроса (то есть с тем же именем)?
Используя модель веб-программирования WCF, можно указать операционный контракт следующим образом:
[OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={qs1}&qs2={qs2}")] XElement SomeRequest1(string qs1, string qs2);
Теперь, если бы нам пришлось заключить контракт, который принимает массив параметров с тем же именем (в этом случае qs1 ), так …
[OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={qs1}&qs1={qs2}")] XElement SomeRequest2(string qs1, string qs2);
Мы получаем сообщение об ошибке во время выполнения при вызове метода:
- Тестирование веб-сервисов REST
- Исключение JAXB: class, не известный этому контексту
- JAX-WS - Карта Исключения к ошибкам
- Лучший способ поддерживать данные «application / x-www-form-urlencoded» с WCF?
- asp.net asmx веб-сервис возвращает xml вместо json
строка запроса должна иметь пары «имя = значение» с уникальными именами. Обратите внимание, что имена не зависят от регистра. Дополнительную информацию см. В документации для UriTemplate.
Как определить HTTP-сервис, который предоставляет ресурс с массивом параметров, не прибегая к разъединенному интерфейсу?
- Создание прокси-сервера веб-службы в Visual Studio из файла WSDL
- Установка HttpContext.Current.Session в модульном тесте
- JAX-WS = Когда Apache CXF установлен, он «крадет» стандартную реализацию JDK JAX-WS по умолчанию, как ее решить?
- Создать службу WCF для неуправляемых клиентов C ++
- Запись в stream файлов, возвращенный из getResourceAsStream ()
- Ошибка в клиенте WCF, использующем веб-службу Axis 2 с WS-Security. Имя пользователя: Token PasswordDigest.
- Java: функция переопределения для отключения проверки сертификата SSL
- Почему мой веб-сервис WCF представляет этот объект в другом пространстве имен с разными именами полей?
Я реализовал простой пользовательский QueryStringConverter, так что вы можете сделать qs1 строкой [], тогда переменная строки запроса будет разделена запятой (например, http: // server / service / SomeRequest? Qs1 = val1, val2, val3, val4 )
[OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={qs1}")] XElement SomeRequest2(string[] qs1);
Сначала вам нужен class, который наследуется от WebHttpBehavior, чтобы мы могли ввести наш пользовательский QueryStringConverter:
public class CustomHttpBehavior : System.ServiceModel.Description.WebHttpBehavior { protected override System.ServiceModel.Dispatcher.QueryStringConverter GetQueryStringConverter(System.ServiceModel.Description.OperationDescription operationDescription) { return new CustomQueryStringConverter(); } }
Затем наш CustomQueryStringConverter, который обрабатывает параметры строки []:
public class CustomQueryStringConverter : System.ServiceModel.Dispatcher.QueryStringConverter { public override bool CanConvert(Type type) { if (type == typeof(string[])) { return true; } return base.CanConvert(type); } public override object ConvertStringToValue(string parameter, Type parameterType) { if (parameterType == typeof(string[])) { string[] parms = parameter.Split(','); return parms; } return base.ConvertStringToValue(parameter, parameterType); } public override string ConvertValueToString(object parameter, Type parameterType) { if (parameterType == typeof(string[])) { string valstring = string.Join(",", parameter as string[]); return valstring; } return base.ConvertValueToString(parameter, parameterType); } }
Последнее, что вам нужно сделать, это создать расширение конфигурации поведения, чтобы среда выполнения могла получить экземпляр CustomWebHttpBehavior:
public class CustomHttpBehaviorExtensionElement : System.ServiceModel.Configuration.BehaviorExtensionElement { protected override object CreateBehavior() { return new CustomHttpBehavior(); } public override Type BehaviorType { get { return typeof(CustomHttpBehavior); } } }
Теперь мы добавляем элемент к нашим расширениям конфигурации, чтобы использовать наш CustomWebHttpBehavior, мы используем имя этого расширения вместо
в нашем поведении:
Теперь вы можете также расширить свой CustomQueryStringConverter для обработки других типов, которые по умолчанию не используются, например типы значений с нулевым значением.
ПРИМЕЧАНИЕ. В подключении к микросоединению есть ошибка, которая напрямую связана с этим кодом. Код практически не работает практически во всех случаях, когда вы пытаетесь выполнить запрос для преобразования различных типов.
Пожалуйста, убедитесь, что вы внимательно прочитали это, прежде чем тратить время на создание пользовательских строковых преобразователей запросов REST, которые не могут работать. (Относится к Framework 4.0 и ниже).
Чтобы ответить на ваш комментарий по моему другому ответу:
Вы можете сделать подстановочный параметр в конце строки запроса
[WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={*qs1}")] XElement SomeRequest2(string qs1);
Таким образом, строковый параметр qs1 будет представлять собой всю необработанную последовательность запросов после qs1 =, тогда вы можете проанализировать это вручную в своем коде.
QueryStringConverter полагается на форматирование запроса, поэтому выполнение чего-то точно, как вы хотите, невозможно без возможности перезаписи QueryStringConverter вместо небольших переопределений, которые мы сделали в другом ответе.
Из MSDN:
Сегменты подстановочных знаков должны соответствовать следующим правилам:
- Для каждой строки шаблона может быть не более одного подстановочного сегмента.
- Названный подстановочный сегмент должен отображаться в самом правом сегменте в пути.
- Именованный сегмент подстановок не может сосуществовать с анонимным подстановочным сегментом внутри той же строки шаблона.
- Имя названного подстановочного сегмента должно быть уникальным.
- Именованные подстановочные сегменты не могут иметь значения по умолчанию.
- Именованные сегменты подстановок не могут заканчиваться символом «/».
Имейте в виду, что в WCF 3.5 вы должны указать полное имя сборки в:
Точно так же: SampleService.CustomBehavior, SampleService, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null
В противном случае вы получите исключение:
Ошибка конфигурации
Описание: Произошла ошибка при обработке файла конфигурации, необходимого для обслуживания этого запроса. Ознакомьтесь с конкретными сведениями об ошибках ниже и соответствующим образом измените свой файл конфигурации.Сообщение об ошибке Parser: недопустимый элемент конфигурации. Имя расширения «CustomWebHttp» не зарегистрировано в коллекции в файле system.serviceModel / extensions / behaviorExtensions.