WebAPI Modelbinding - [FromUri]没有处理Guids的枚举

时间:2016-10-24 10:52:40

标签: c# asp.net-web-api ienumerable model-binding

我正在尝试构建一个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;

这将构建像我这样的东西。

  

http://localhost/API/Reporting/EndPoint?Ids=b94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b,77dc84ac-4d48-4cbd-ba12-9de3108a5747

端点接受使用[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; }
}

1 个答案:

答案 0 :(得分:2)

现在我根据这种情况模拟了一个集成测试。默认的[FromUri]模型绑定器具有问题绑定Guid,因为您当前在查询字符串中有它们,因为它只读取一个长字符串

  

94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b,77dc84ac-4d48-4cbd-ba12-9de3108a5747

它无法解析为有效的Guid。因此,该集合只有一个空Guiddefault(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

开始