У меня есть проект ASP.Net Web API. Я использую NHibernate в этом проекте; Свободный NHibernate должен быть конкретным. Я обрабатываю управление сеансом NHib с помощью пользовательского ActionFilterAttribute. Это выглядит так:ASP.NET Web API - Как сохранить сеанс до тех пор, пока пользовательский MediaTypeFormatter не будет завершен?
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 моего действия. Проблема, с которой я сталкиваюсь, заключается в том, что мой метод ActionFilter OnActionExecuted() вызывается до того, как WriteToStreamAsync MediaTypeFormatter сможет выполнить эту работу. В результате получается, что лениво загруженные (проблемные) коллекции недоступны, так как сеанс закрыт. Каков наилучший способ справиться с этим? Должен ли я удалить метод OnActionExecuted ActionFilter и просто закрыть сеанс в MediaTypeFormatter?
Спасибо!
Я согласен, что добавление кода управления сеансом в MediaTypeFormatter просто неверно. Если у вас есть псевдо-код, я могу его использовать. Я не очень хорошо разбираюсь в стеке Web Api. – Nick
Сообщение обновлено, надеюсь, что это поможет. –
Ты потрясающий. Спасибо за это. – Nick