ASP.Net Web API プロジェクトがあります。このプロジェクトでは NHibernate を使用しています。具体的には流暢な NHibernate です。カスタムActionFilterAttributeを使用してNHibセッション管理を処理しています。次のようになります。
public class SessionManagement : ActionFilterAttribute
{
public SessionManagement()
{
SessionFactory = WebApiApplication.SessionFactory;
}
private ISessionFactory SessionFactory { get; set; }
public override void OnActionExecuting(HttpActionContext actionContext)
{
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
session.BeginTransaction();
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var session = SessionFactory.GetCurrentSession();
var transaction = session.Transaction;
if (transaction != null && transaction.IsActive)
{
transaction.Commit();
}
session = CurrentSessionContext.Unbind(SessionFactory);
session.Close();
}
これは私のニーズにうまく機能していました。ただし、最近、カスタム JSON.NET MediaTypeFormatter を追加して、アクションの結果の JSON をフォーマットしました。私が抱えている問題は、MediaTypeFormatter の WriteToStreamAsync がその仕事を行う前に、私の ActionFilter OnActionExecuted() メソッドが呼び出されることです。その結果、セッションが閉じられているため、遅延ロードされた (問題の) コレクションが使用できなくなります。これを処理する最善の方法は何ですか? ActionFilter の OnActionExecuted メソッドを削除して、MediaTypeFormatter でセッションを閉じる必要がありますか?
ありがとう!!