我正在运行 NServiceBus 的 2.0 RTM,当我的 MessageModule 将 CurrentSessionContext 绑定到我的 NHibernate sessionfactory 时,我得到了 NullReferenceException。
在我的 Application_Start 中,我调用以下方法:
public static void WithWeb(IUnityContainer container)
{
log4net.Config.XmlConfigurator.Configure();
var childContainer = container.CreateChildContainer();
childContainer.RegisterInstance<ISessionFactory>(NHibernateSession.SessionFactory);
var bus = NServiceBus.Configure.WithWeb()
.UnityBuilder(childContainer)
.Log4Net()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.LoadMessageHandlers()
.CreateBus();
var activeBus = bus.Start();
container.RegisterInstance(typeof(IBus), activeBus);
}
当总线启动时,我的消息模块以以下内容开始:
public void HandleBeginMessage()
{
try
{
CurrentSessionContext.Bind(_sessionFactory.OpenSession());
}
catch (Exception e)
{
_log.Error("Error occurred in HandleBeginMessage of NHibernateMessageModule", e);
throw;
}
}
在查看我的日志时,我们在调用 bind 方法时记录了以下错误:
System.NullReferenceException: Object reference not set to an instance of an object.
at NHibernate.Context.WebSessionContext.GetMap()
at NHibernate.Context.MapBasedSessionContext.set_Session(ISession value)
at NHibernate.Context.CurrentSessionContext.Bind(ISession session)
显然,访问 HttpContext 存在一些问题。这个配置 NServiceBus 的调用是否应该在生命周期中比 Application_Start 更晚发生?或者是否有其他人用来让处理程序在 Asp.NET Web 应用程序中工作的另一种解决方法?
谢谢,史蒂夫