【问题标题】:Retreive WCF query parameters as a single string将 WCF 查询参数作为单个字符串检索
【发布时间】:2017-02-10 10:48:41
【问题描述】:

我需要定义一个 WCF GET 方法,它可以将所有查询参数作为单个字符串检索。示例:

https://xxx.xxx.xxx.xxx/token?client_id=abc_def&client_name=&type=auth&code=xyz

我想获取字符串“client_id=abc_def&client_name=&type=auth&code=xyz”。

如何定义方法的 URI 模板?我尝试了以下方法,但它不起作用,因为我会收到 400 Bad Request。将 /" 替换为 "?" 没有区别。

[WebGet(UriTemplate = "token/{Params}")]
[OperationContract]
Stream GetToken(string Params);

该方法将调用外部服务并转发它接收到的任何查询参数。我不想单独检索每个参数,因为参数可能会增加。

另一个网址是这样的:

https://xxx.xxx.xxx.xxx/person/123456?client_id=abc_def&client_name=&type=auth&code=xyz

在这种情况下,我想获取两个字符串“123456”和“client_id=abc_def&client_name=&type=auth&code=xyz”。

如何定义方法的 URI 模板?

【问题讨论】:

    标签: wcf url query-string uritemplate


    【解决方案1】:

    您可以在UriTemplate 中设置预期的查询字符串参数,如下所示:

    (UriTemplate = "token/{Params}&client_id={clientId}&client_name={clientName}&type={type}&code={code})

    方法可以这样声明:

    Stream GetToken(string Params, string clientId, string clienteName, string type, string code);
    

    【讨论】:

    • 嗨,我已经知道该怎么做了。但这不是我想要的。我想将整个查询参数作为单个字符串获取。正如我的帖子中所解释的,我的服务将调用另一个外部服务,传递查询参数。我不想解析每个查询参数。如果我能够检索为单个字符串,那么如果将来查询参数发生变化,则无需更改代码。
    • 看起来很明显,但是你试过HttpContext.Current.Request.QueryString吗?
    • 没有。首先,如何为方法指定URI模板?
    【解决方案2】:

    您可以省略 URI 模板并使用 NameValueCollection from WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters 然后只需拨打 'ToString()' 电话,你就会得到你想要的

    String fullQueryParams = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters.ToString()
    

    如果您还需要路径,例如检索 url 中的 person123456 字符串:

    https://xxx.xxx.xxx.xxx/person/123456?client_id=abc_def&client_name=&type=auth&code=xyz

    您可以使用WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RelativePathSegments。那么你的 OperationContract 实现将是这样的:

    String fullQueryParams = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters.ToString();
    //fullQueryParams = "client_id=abc_def&client_name=&type=auth&code=xyz"
    
    var pathsCollection = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RelativePathSegments;
    //pathsCollection = ["person","12345"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多