gpt4 book ai didi

c# - 使用查询字符串参数消除 UriTemplate 匹配项的歧义

转载 作者:IT王子 更新时间:2023-10-29 04:30:43 25 4
gpt4 key购买 nike

我正在使用 WCF 4.0 创建 REST-ful Web 服务。我想要做的是根据 UriTemplate 中的查询字符串参数调用不同的服务方法。

例如,我有一个 API,允许用户使用驾驶执照或社会安全号码作为 key 来检索有关某个人的信息。在我的 ServiceContract/接口(interface)中,我将定义两种方法:

[OperationContract]
[WebGet(UriTemplate = "people?driversLicense={driversLicense}")]
string GetPersonByLicense(string driversLicense);

[OperationContract]
[WebGet(UriTemplate = "people?ssn={ssn}")]
string GetPersonBySSN(string ssn);

但是,当我使用这两种方法调用我的服务时,出现以下异常:

UriTemplateTable does not support multiple templates that have equivalent path as template 'people?ssn={ssn}' but have different query strings, where the query strings cannot all be disambiguated via literal values. See the documentation for UriTemplateTable for more detail.

有没有办法用 UriTemplates 做到这一点?这似乎是一个常见的场景。

非常感谢!

最佳答案

我也遇到过这个问题,最终想出了一个不同的解决方案。我不想为对象的每个属性使用不同的方法。

我的做法如下:

在不指定任何查询字符串参数的服务契约(Contract)中定义 URL 模板:

[WebGet(UriTemplate = "/People?")]
[OperationContract]
List<Person> GetPersonByParams();

然后在实现中访问任何有效的查询字符串参数:

public List<Person> GetPersonByParms()
{
PersonParams options= null;

if (WebOperationContext.Current != null)
{
options= new PersonParams();

options.ssn= WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["ssn"];
options.driversLicense = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["driversLicense"];
options.YearOfBirth = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["YearOfBirth"];
}

return _repository.GetPersonByProperties(options);
}

然后您可以使用 URL 进行搜索,例如

/PersonService.svc/People 
/PersonService.svc/People?ssn=5552
/PersonService.svc/People?ssn=5552&driversLicense=123456

它还使您能够混合和匹配查询字符串参数,因此只需使用您想要的并忽略您不感兴趣的任何其他参数。它的优点是不会将您限制为仅使用一个查询参数。

关于c# - 使用查询字符串参数消除 UriTemplate 匹配项的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com