7

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);
    }

これは完璧ではないかもしれませんが、意図したとおりに機能しているようです。

4

2 に答える 2

1

このSOの質問と回答WebHttpBehaviorに示されているように、ClientBase(またはChannelFactory)派生クラスに適用できるため、オプション1)はWCFクライアントで機能します。1)で参照するコードを、500応答のキャプチャの質問に示されている構成と組み合わせるだけで、動作が示されます。

于 2012-05-10T18:46:13.100 に答える
0

null 許容型を使用してみましたか?

object GetStuff(string param, int? top, DateTime? first);
于 2012-05-10T18:52:27.253 に答える