Я реализовал простой пользовательский QueryStringConverter, чтобы вы могли сделать qs1 строкой [], а затем переменная строки запроса должна быть разделена запятой (например, http://server/service/SomeRequest?qs1=val1,val2,val3,val4)
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "SomeRequest?qs1={qs1}")]
XElement SomeRequest2(string[] qs1);
Сначала вам нужен класс, который наследуется от 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, и мы используем Имя этого расширения вместо <webHttp />
в нашем поведении:
<system.serviceModel>
<services>
<service name="NameSpace.ServiceClass">
<endpoint address="" behaviorConfiguration="MyServiceBehavior"
binding="webHttpBinding" contract="NameSpace.ServiceClass" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="MyServiceBehavior">
<customWebHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="customWebHttp" type="NameSpace.CustomHttpBehaviorExtensionElement, MyAssemblyName" />
</behaviorExtensions>
</extensions>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Теперь вы также можете расширить свой CustomQueryStringConverter для обработки других типов, которые по умолчанию не доступны, таких как типы значений, допускающие значение NULL.
ПРИМЕЧАНИЕ. В microsoft connect зарегистрирована ошибка, которая напрямую связана с этим кодом. Код фактически не работает практически во всех случаях, когда вы пытаетесь преобразовать запрос различных типов.
http://connect.microsoft.com/VisualStudio/feedback/details/616486/bug-with-getquerystringconverter-not-being-called-by-webservicehost#tabs
Пожалуйста, убедитесь, что вы внимательно прочитали это, прежде чем тратить часы своего времени на создание пользовательских конвертеров строк запросов REST, которые не могут работать. (Относится к Framework 4.0 и ниже).