シンプルなカスタム QueryStringConverter を実装したので、qs1 を string[] にしてから、クエリ文字列変数をカンマ区切りにすることができます (例: http://server/service/SomeRequest?qs1=val1,val2,val3,val4 ) 。
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "SomeRequest?qs1={qs1}")]
XElement SomeRequest2(string[] qs1);
まず、カスタム QueryStringConverter を挿入できるように、WebHttpBehavior から継承するクラスが必要です。
public class CustomHttpBehavior : System.ServiceModel.Description.WebHttpBehavior
{
protected override System.ServiceModel.Dispatcher.QueryStringConverter GetQueryStringConverter(System.ServiceModel.Description.OperationDescription operationDescription)
{
return new CustomQueryStringConverter();
}
}
次に、string[] パラメータを処理する 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 />
ます。動作ではなく、その拡張機能の Name を使用します。
<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 以下に適用されます)。