2

使い方を知りたい:

string limit = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["Limit"];

このメソッドの私のwcfで:

CityNewsList GetNewsByCity(string DeviceType,string id,string limit);

ここで「devicetype」と「id」はデフォルトのパラメーターであり、オプションのパラメーターとして「limit」が必要なのは、ユーザーがこのパラメーターを渡すことができるか、これを渡すことができないかを選択できることを意味します。

limit を次のように使用したい:

if (limit == some value)
{
    //do this.
}
if (limit == null)
{
    // do this.
}

私は多くのリンクをたどりましたが、これを自分の wcf で使用する方法がわかりませんでした。

または、WCF サービスでパラメーターをオプションにする方法を誰かに教えてもらえれば。

4

4 に答える 4

2

つまり、実際には WCF を使用して REST サービスを作成しています。あなたが作成している可能性のある複製の質問への回答であなたが何を意味するのかを読みました: WCF RESTサービスでオプションのパラメーターを使用する方法は?

WebGet または WebInvoke 属性の UriTemplate からクエリ文字列を省略し、WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters .

つまり、次のようになります。

メソッドのシグネチャを変更して、パラメーターを省略します。

CityNewsList GetNewsByCity(string DeviceType,string id /*,string limit*/);

パラメータがクエリ文字列で予期されないように属性を変更します。

[OperationContract]
[WebGet(UriTemplate = "/whatever/{DeviceType}/{id}", RequestFormat = WebMessageFormat.Xml)]

それ以外の

[OperationContract]
[WebGet(UriTemplate = "/whatever/{DeviceType}/{id}/{limit}", RequestFormat = WebMessageFormat.Xml)]

最終的には次のようになります。

[OperationContract]
[WebGet(UriTemplate = "/whatever/{DeviceType}/{id}", RequestFormat = WebMessageFormat.Xml)]
CityNewsList GetNewsByCity(string DeviceType,string id);

そして、実装で最初に行うことは次のとおりです。

string limit = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["Limit"];

ただし、私はそれを試していませんが、それはあなたの質問へのコメントで引用したことから私が理解していることです。

于 2012-09-03T12:26:12.157 に答える
1

最近、同様の問題が発生し、デフォルトの QueryStringConverter をオーバーライドすることで解決しました。

1) System.ServiceModel.Dispatcher.QueryStringConverter をサブクラス化し、その ConvertStringToValue メソッドをオーバーライドします。

すべての列挙型をオプションにする例 (値がない場合はデフォルト値が使用されます)

  public override object ConvertStringToValue(string parameter, Type parameterType)
        {
            if (parameterType.IsEnum)
            {
                if (string.IsNullOrEmpty(parameter))
                {
                    return Activator.CreateInstance(parameterType);
                }
            }

            return base.ConvertStringToValue(parameter, parameterType);

        }

2) System.ServiceModel.Description.WebHttpBehavior をサブクラス化し、その GetQueryStringConverter メソッドをオーバーライドして、変更したクエリ文字列コンバーターを返します。

public class ExtendedQueryStringBehavior : WebHttpBehavior
{
    protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)
    {
        return new ExtendedQueryStringConverter();
    }
}

3) 新しい WebHttpBehavior を目的のエンドポイントに接続します (この機能を他のものとマージする必要がある場合があります)。

QS コンバーター、複雑な型、csv リスト、配列などを使用して、非常に複雑なシナリオをサポートできます。すべてが厳密に型指定され、単一のポイントから変換を管理できます。サービス/メソッド レベルでの解析の悪夢に対処する必要はありません。

于 2012-10-25T13:21:19.163 に答える