1

我需要定义一个 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);

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

另一个 URL 是这样的:

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 模板?

4

2 回答 2

0

您可以省略 URI 模板并使用NameValueCollectionfrom WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters 然后只需进行 'ToString()' 调用,您将得到您想要的

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

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

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"]
于 2017-09-21T21:48:19.113 回答
0

您可以在 中设置预期的查询字符串参数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);
于 2017-02-10T16:08:51.170 回答