Ответ 1
Я реализовал простой пользовательский 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 для обработки других типов, которые по умолчанию отсутствуют, например, типы значений с нулевым значением.
ПРИМЕЧАНИЕ. В подключении к Microsoftsoft имеется ошибка, которая напрямую связана с этим кодом. Код практически не работает практически во всех случаях, когда вы пытаетесь выполнить запрос для преобразования различных типов.
Пожалуйста, убедитесь, что вы внимательно прочитали это, прежде чем тратить время на создание пользовательских строковых преобразователей запросов REST, которые не могут работать. (Применимо к Framework 4.0 и ниже).