1

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 アプリケーション内でハンドラーを動作させるために他の人が使用した別の回避策はありますか?

ありがとう、スティーブ

4

1 に答える 1

1

NServiceBus は HttpContext とは独立して動作できるため、この場合は WebSessionContext を使用しません。Web と NServiceBus の両方のメッセージ処理に単一のセッション コンテキスト実装を使用する場合はNHibernate.Context.ICurrentSessionContext、ハイブリッド ストレージを使用して実装します。つまり、HttpContext.Current != null の場合、HttpContext をセッション ストレージとして使用します。それ以外の場合は、スレッド ローカル ストレージを使用します。これは、Castle ActiveRecord がそのHybridWebThreadScopeInfo.

于 2010-04-29T00:26:41.407 に答える