2009-07-28 4 views
0

Ich arbeite mit einem ziemlich großen Abfragezeichenfolge (~ 30 + Parameter) und versuche, sie an einen WCF-Dienst zu übergeben, den ich eingerichtet habe.WCF UriTemplate mit großen Abfragezeichenfolgen

Ich habe ein paar Probleme speziell mit dem UriTemplate-Feld. Dieser Dienst ist so eingerichtet, dass er auf eine API von Drittanbietern zugreift, sodass die Abfragezeichenfolge möglicherweise alle Parameter enthält. Ich bin neugierig, ob der beste Ansatz darin besteht, eine Abfragezeichenfolge zu erstellen und diese an den WCF-Dienst zu übergeben oder jeden Parameter (und in einigen Fällen String.Empty) einzeln zu übergeben.

Ich habe derzeit versucht, dynamisch eine Abfragezeichenfolge aufzubauen, habe jedoch eine Wand mit einem Fehler 403 getroffen, wenn ich versuche, die gesamte Zeichenfolge ("? Prm1 = val & prm2 = val") in die uritemplate zu übergeben von "ApiTool.jsp {query}", oder ich traf eine ungültige uritemplate Antwort aufgrund der Tatsache, dass ich keine Name/Wert-Paare aufgelistet habe.

+0

Ich bin mir nicht sicher, ob ich das Szenario verstehe. Können Sie ein vereinfachtes Beispiel veröffentlichen? –

+0

Sicher Sache. Ursprünglich war ich versuche, etwas entlang der Linien von: Responseformat = WebMessageFormat.Xml, UriTemplate = "TargetApi.jsp {query}" ich den speziell angefertigten Query-String in voller Höhe durch diesen Parameter übergeben würde. Ich wusste nicht, dass dies bis vor kurzem nicht erlaubt sein könnte. Ich bin zurück gegangen und habe einige Refactoring (vielleicht für die beste) getan, am Ende mit den richtigen Namen Wert Paare in der Abfrage Zeichenfolge: UriTemplate = "TargetApi.jsp? Key = {Schlüssel} & OtherParam = {otherParam } " Obwohl der zweite Weg wegen der großen Anzahl von Variablen ausführlich ist, scheint es in diesem Szenario notwendig. –

Antwort

0

Ich bin mir ziemlich sicher, dass Sie die Parameter einzeln auflisten müssen. Andernfalls wird UriTemplate am Ende entkommen Dinge für Sie:

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

Nachdem ich mich eingehender damit beschäftigt habe, muss ich zustimmen. Es ist ein wenig umständlich, wenn man mit einer dynamischen Menge von Parametern (dh, param1, param2 ... paramN) zu tun hat, aber ich war nicht in der Lage, einen Weg darum herum zu sehen. –

0

Sie können ‚unescape‘ mit IClientMessageInspector querystring.

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

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

Siehe MSDN, wie Sie dies zu Ihrem Endpoint-Objekt hinzufügen.

Verwandte Themen