2009-07-28 69 views
0

我正在处理一个相当大的查询字符串(〜30 +参数),并试图将它们传递给我设置的WCF服务。带有大查询字符串的WCF UriTemplate

我遇到了几个与UriTemplate字段有关的问题。此服务设置为访问第三方Api,因此查询字符串可能包含或不包含所有参数。我很好奇,如果最好的方法是建立一个查询字符串,并将其传递给WCF服务或单独传递每个参数(并在某些情况下String.Empty)。

我目前试图动态建立一个查询字符串,但是当我尝试将整个字符串(“?prm1 = val & prm2 = val”)传递到uritemplate “ApiTool.jsp {query}”,或者由于我没有名称/值对列出的事实,我击中了一个无效的uritemplate响应。

+0

我不确定我了解情况。你能发表一个简单的例子吗? – 2009-07-29 02:41:13

+0

当然可以。本来我是想沿着线的东西: ResponseFormat = WebMessageFormat.Xml, UriTemplate =“{TargetApi.jsp查询}” 我会通过全面的定制查询字符串通过此参数。直到最近我才意识到这可能不被允许。 我回来了,做了一些重构(可能是最好的),最后在查询字符串中输入了正确的名称值对: UriTemplate =“TargetApi.jsp?key = {key}&otherParam = {otherParam }“ 虽然第二种方法由于大量的变量而变得冗长,但在这种情况下似乎有必要。 – 2009-07-29 14:17:24

回答

0

我很肯定你需要单独列出参数。否则,UriTemplate将最终逃脱你的东西:

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

你可以 'UNESCAPE' 与IClientMessageInspector查询字符串。

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

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

请参阅MSDN如何将其添加到您的端点对象。