WCFを使用して単純なサービスを利用しようとすると問題が発生します。オプションのクエリ文字列パラメータを実装する場合を除いて、これまでのところすべてが順調に進んでいます。インターフェイスは次のようになります。
[ServiceContract]
[XmlSerializerFormat]
public interface IApi
{
[OperationContract]
[WebGet(UriTemplate = "/url/{param}?top={top}&first={first}")]
object GetStuff(string param, int top, DateTime first);
}
次に、これは、を継承するクラスを作成することによって消費されClientBase<IApi>
ます。パラメータをオプションにするいくつかの方法を試しました。
1)パラメータをnull許容にする
これは機能しませんでした。QueryStringConverter
別の質問が尋ねたようなメッセージが表示されます: WCFサービスコントラクトにnull許容の入力パラメーターを含めることはできますか?
2)URLの最後にある1つのパラメーター
そこで、UriTemplateをより一般的なものに変更し、クエリ文字列を作成してパラメーターとして渡すことを考えました。渡された値は、サーバーによってクエリ文字列として認識されないようにエンコードされるため、これも機能していないようです。
例:
[WebGet(UriTemplate = "/url/{query}")]
3)ハッキッシュソリューション
これを機能させるためにこれまでに見つけた唯一の方法は、すべてのパラメーターを文字列に変更することであり、ここではNULLが許可されているようです。
例:
[WebGet(UriTemplate = "/url/{param}?top={top}&first={first}")]
object GetStuff(string param, string top, string first);
このインターフェースの使用は、正しい変数タイプを受け入れますが、ToString
使用されます。クエリ文字列パラメータは、実際のリクエストに引き続き表示されます。
では、WCFを使用してRESTサービスを利用するときに、クエリ文字列パラメーターをオプションにする方法はありますか?
更新-修正方法
サービス動作を作成するためのアドバイスが行われました。これはから継承しWebHttpBehaviour
ます。次のようになります。
public class Api : ClientBase<IApi>
{
public Api() : base("Binding")
{
Endpoint.Behaviors.Add(new NullableWebHttpBehavior());
}
}
はNullableWebHttpBehavior
、次のStackoverflowの質問で見つけることができます。WCFサービスコントラクトにnull許容の入力パラメーターを含めることはできますか?。唯一の問題は、ConvertValueToString
過負荷ではなかったので、簡単なものを作成しました。
public override string ConvertValueToString(object parameter, Type parameterType)
{
var underlyingType = Nullable.GetUnderlyingType(parameterType);
// Handle nullable types
if (underlyingType != null)
{
var asString = parameter.ToString();
if (string.IsNullOrEmpty(asString))
{
return null;
}
return base.ConvertValueToString(parameter, underlyingType);
}
return base.ConvertValueToString(parameter, parameterType);
}
これは完璧ではないかもしれませんが、意図したとおりに機能しているようです。