2009-07-28 11 views
0

かなり大きなクエリ文字列(〜30 +パラメータ)を使用しており、セットアップしたWCFサービスに渡そうとしています。大きなクエリ文字列を持つWCF UriTemplate

私は特に、UriTemplateフィールドにいくつかの問題が発生しました。このサービスはサードパーティのApiにアクセスするように設定されているため、クエリ文字列にはすべてのパラメータが含まれる場合と含まれない場合があります。最良の方法は、クエリ文字列を作成し、それをWCFサービスに渡すか、各パラメータ(場合によってはString.Empty)を個別に渡すことです。

私は現在、クエリ文字列を動的に構築しようとしましたが、文字列全体( "?prm1 = val & prm2 = val")をuritemplateに渡そうとすると、 「ApiTool.jsp {query}」の名前がないか、名前/値のペアがリストされていないため、無効なuritemplateレスポンスが表示されます。

+0

私はこのシナリオを理解していません。簡単な例を投稿できますか? –

+0

確かです。私は、このパラメータを使用してフルカスタム構築されたクエリ文字列を渡したい ResponseFormat = WebMessageFormat.Xml、 UriTemplate =「TargetApi.jsp {クエリ}」 :もともと私はの線に沿って何かをしようとしていました。最近までこれが許可されていないかもしれないことは分かりませんでした。 私は戻ってリファクタリングを行ったことがありますが(おそらく最高のため)、クエリ文字列に正しい名前の値のペアがあります。 UriTemplate = "TargetApi.jsp?key = {key}&otherParam = {otherParam } " 変数の数が多いため、2番目の方法は冗長ですが、このシナリオでは必要と思われます。 –

答えて

0

パラメータを個別にリストする必要があります。それ以外の場合は、UriTemplateはあなたのために物事をエスケープすることになります:あなたは「アンエスケープ」IClientMessageInspectorでクエリ文字列ができ

var ut = new UriTemplate("Api.jsp{query}"); 
    var u = ut.BindByName(new Uri("http://localhost"), new Dictionary<string, string>() { { "query", "?param1=a&param2=b" } }); 
    Console.WriteLine(u); // http://localhost/Api.jsp%3Fparam1=a&param2=b 
+0

これを深く理解した後、私は同意する必要があります。パラメタの動的量(すなわち、param1、param2 ... paramN)を扱うときに少し面倒ですが、私はそれを回避する方法を見ることができませんでした。 –

0

public class UriInspector: IClientMessageInspector 
{ 
    public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 

     // change/replace request.Headers.To Uri object; 
     return null; 
    } 
} 

MSDN Endpointオブジェクトにこれを追加する方法を参照してください。

関連する問題