我正在尝试构建一个RESTApi端点,用户可以发送多个ID来过滤特定资源。
因此我创建了一个请求对象,可以在我自己的项目中重用它来保持简单(至少对我而言)。
在构建GET调用QueryString时,我检查request-ojects属性是否为IEnumerable
。如果是这样,我会将值附加如下:
var collection = new NameValueCollection();
foreach (var pi in request.GetType().GetProperties().Where(p => p.CanRead && p.CanWrite))
{
var propVal = pi.GetValue(request, null);
if (propVal == null)
continue;
if (pi.PropertyType.IsArray || typeof(IEnumerable).IsAssignableFrom(pi.PropertyType))
{
var enumerable = propVal as IEnumerable;
if (enumerable != null)
{
foreach (var singleValue in enumerable)
{
collection.Add(pi.Name, singleValue.ToString());
}
}
}
else
{
collection.Add(pi.Name, propVal.ToString());
}
}
return collection;
这将构建像我这样的东西。
端点接受使用[FromUri]
属性从uri构建它的请求对象。
public TheResponse EndPoint([FromUri] TheRequest request)
而TheRequest
的属性类型为IEnumerable<Guid> Ids {get;set;}
。
但是,Ids属性始终是一个空数组Guid
。
如何实现这一目标?我在这里需要自定义模型绑定吗?
根据要求,这是我的请求对象的样子:
public class TheRequest
{
public IEnumerable<Guid> Ids { get; set; }
}
答案 0 :(得分:2)
现在我根据这种情况模拟了一个集成测试。默认的[FromUri]
模型绑定器具有问题绑定Guid
,因为您当前在查询字符串中有它们,因为它只读取一个长字符串
94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b,77dc84ac-4d48-4cbd-ba12-9de3108a5747
它无法解析为有效的Guid
。因此,该集合只有一个空Guid
(default(Guid)
或Guid.Empty
)。
但是如果查询字符串是这样提供的:
/ API /报表/端点IDS = b94a3f1b-15CD-4feb-AC34-bd58bc1c3c2b&安培; IDS = 77dc84ac-4d48-4cbd-ba12-9de3108a5747
通过将它们分成单独的参数?Ids={guid}&Ids={guid}
并对其进行测试,请注意将使用填充的正确参数调用端点。
因此,要么更改URL的构造方式,要么无法更改当前格式,请创建自定义模型绑定器以根据需要解释查询字符串。
对于自定义模型活页夹,请从此处Parameter Binding in ASP.NET Web API
开始