Я реализовал простой пользовательский 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, который обрабатывает параметры string []:
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 и ниже).
person
joshperry
schedule
10.12.2008
[WebGet], вы можете вместо него использовать[WebInvoke(Method = "POST"], в котором разрешены массивы / коллекции. См. этот ответ. - person stomy   schedule 12.04.2018