建模绑定永远

时间:2016-03-22 19:26:47

标签: c# asp.net-web-api2

我有一个UserFilter类作为Web API 2操作方法的参数,需要大约30秒才能完成绑定。我已经进入了UserFilter类,因为它正在创建它并且它在所有实例化中都没有时间,但是一旦它创建的Web API在后台执行某些事务会计约30秒然后最终开始执行我的行动方法。

我在同一项目中的MVC控制器上设置了UserFilter,它立即绑定,没有延迟。这只是Web API遇到了这个问题。

我该怎么做才能弄清楚Web API在后台做了什么?

我是否可以在绑定生命周期中锁定一个事件?

[Route("all")]
[HttpPost]
public async Task<IHttpActionResult> GetUsers([FromBody]UserFilter filter)
{
    // takes ~30 seconds before a breakpoint hits this next line
    filter = UserFilter.InitializeFilter(filter);

    var userList = await UserRepository.GetUsers(filter).ConfigureAwait(false);
    return Ok(new JsonResponse(new { Users = userList, Pager = filter.Pager }));
}

public class UserFilter : BaseFilter<UserFilter, User>
{
    // DO NOT REMOVE: default constructor needed for model binding
    public UserFilter() : base() { }

    public UserFilter(int? pageSize)
        : base(pageSize)
    {
    }
    ...
}

public abstract class BaseFilter<TFilterType, TEntity>
{
    // default constructor needed for model binding
    public BaseFilter()
    {
        Pager = new Pager(null);
        Init();
    }

    public BaseFilter(int? pageSize)
    {
        Pager = new Pager(pageSize);
        Init();
    }
    ...
}

1 个答案:

答案 0 :(得分:0)

原来是Web API 2模型绑定代码的问题。类QueryMutatorCondition有一个构造函数,它将泛型Predicate<>Func<>作为参数。这就是Web API窒息的原因。

由于未知原因,它继续尝试绑定到QueryMutators属性(BaseFilter类的成员),即使我告诉它使用该属性忽略它。修复方法是将访问修饰符更改为internal而不是public,以防止Web API尝试绑定到它。

[JsonIgnore]
public List<QueryMutatorCondition<TFilterType, TEntity>> QueryMutators { get; set; }

成为:

internal List<QueryMutatorCondition<TFilterType, TEntity>> QueryMutators { get; set; }