在Web应用程序Application_Start方法中初始化NServiceBus时出现NullReferenceException

时间:2010-04-28 16:47:25

标签: asp.net nhibernate nservicebus nullreferenceexception

我正在运行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应用程序中工作?

谢谢, 史蒂夫

1 个答案:

答案 0 :(得分:1)

在这种情况下我不会使用WebSessionContext,正是因为NServiceBus可以独立于HttpContexts运行。如果要对Web和NServiceBus消息处理使用单个会话上下文实现,我将使用混合存储实现NHibernate.Context.ICurrentSessionContext,即如果HttpContext.Current!= null,则使用HttpContext作为会话存储。否则使用线程本地存储。这与Castle ActiveRecord对其HybridWebThreadScopeInfo所做的类似。