我有一个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();
}
...
}
答案 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; }