В модели веб-программирования 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); 

Мы получаем сообщение об ошибке во время выполнения при вызове метода:

строка запроса должна иметь пары «имя = значение» с уникальными именами. Обратите внимание, что имена не зависят от регистра. Дополнительную информацию см. В документации для UriTemplate.

Как определить HTTP-сервис, который предоставляет ресурс с массивом параметров, не прибегая к разъединенному интерфейсу?

Я реализовал простой пользовательский 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 для обработки других типов, которые по умолчанию не используются, например типы значений с нулевым значением.

ПРИМЕЧАНИЕ. В подключении к микросоединению есть ошибка, которая напрямую связана с этим кодом. Код практически не работает практически во всех случаях, когда вы пытаетесь выполнить запрос для преобразования различных типов.

http://connect.microsoft.com/VisualStudio/feedback/details/616486/bug-with-getquerystringconverter-not-being-called-by-webservicehost#tabs

Пожалуйста, убедитесь, что вы внимательно прочитали это, прежде чем тратить время на создание пользовательских строковых преобразователей запросов 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.

  • Вызов метода на стороне сервера ASP.NET через jQuery
  • jqgrid добавить строку и отправить данные в webservice для вставки
  • Отчеты в SOA (Business Intelligence & Service Oriented Architecture)
  • Шаги по созданию веб-службы с использованием Axis2 - Код клиента
  • Большой запрос веб-службы WCF с ошибкой (400) Ошибка HTTP-запроса
  • JQuery Ajax Проводка json для webservice
  • Что такое файл .episode ..?
  • Как использовать WSDL
  • Как получить доступ к параметрам в методе POST RESTful
  • Каковы различия между веб-службами WCF и ASMX?
  • Каков правильный способ отправки файла из веб-сервиса REST клиенту?
  • Давайте будем гением компьютера.