2016-03-22 8 views
0

バインディングを完了するまでに30秒かかるWeb API 2アクションメソッドでパラメータとしてUserFilterクラスが取得されました。私はすでに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

Web API 2モデルのバインドコードで問題となっていました。クラスQueryMutatorConditionには、汎用のPredicate<>Func<>をパラメータとして持つコンストラクタがありました。これはWeb APIが窒息していたものです。

不明な理由で、私が属性で無視するように言っても、それはQueryMutatorsプロパティ(BaseFilterクラスのメンバー)にバインドしようとしました。 Web APIがバインドしようとしないように、publicの代わりにアクセス修飾子をinternalに変更しました。

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

になった:

internal List<QueryMutatorCondition<TFilterType, TEntity>> QueryMutators { get; set; } 
関連する問題