2016-03-22 14 views
0

Ich habe eine UserFilter Klasse als Parameter auf einer Web API 2 Aktion Methode, die ~ 30 Sekunden dauert, um die Bindung abzuschließen. Ich bin bereits in die Klasse UserFilter eingetreten, da sie erstellt wird und es keine Zeit in Anspruch nimmt, aber sobald die erstellte Web-API etwas im Hintergrund für die ~ 30 Sekunden erledigt und schließlich meine Aktionsmethode ausführt.Modellierung Bindung dauert für immer

Ich habe die UserFilter auf einem MVC-Controller in diesem Projekt eingerichtet und es sofort ohne Verzögerungen binden. Es ist nur Web-API, die dieses Problem hat.


Was kann ich tun, um herauszufinden, was Web API im Hintergrund macht?

Gibt es ein Ereignis, auf das ich im Bindungslebenszyklus zugreifen kann?

[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(); 
    } 
    ... 
} 

Antwort

0

Es stellte sich heraus, dass es sich um ein Problem mit dem Web API 2-Modell-Bindungscode handelte. Die Klasse QueryMutatorCondition hatte einen Konstruktor, der generische Predicate<> und Func<> als Parameter nahm. Dies ist, was Web API erstickt.

Aus unbekannten Gründen versuchte es weiterhin, an die QueryMutators-Eigenschaft (Mitglied der BaseFilter-Klasse) zu binden, obwohl ich ihm sagte, es mit dem Attribut zu ignorieren. Der Fehler bestand darin, den Zugriffsmodifizierer in internal anstelle von public zu ändern, um zu verhindern, dass die Web-API versucht, eine Bindung zu ihm herzustellen.

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

wurde:

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