2010-04-28 1 views
1

Je cours le RTM 2.0 de NServiceBus et j'obtiens une exception NullReferenceException lorsque mon MessageModule lie le CurrentSessionContext à mon sessionfactory NHibernate.NullReferenceException lors de l'initialisation de NServiceBus dans l'application Web Méthode Application_Start

à partir de mon Application_Start, j'appelle la méthode suivante:

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); 
} 

Lorsque le bus est démarré, mon module de message commence par ce qui suit:

public void HandleBeginMessage() 
{ 
    try 
    { 
     CurrentSessionContext.Bind(_sessionFactory.OpenSession()); 
    } 
    catch (Exception e) 
    { 
     _log.Error("Error occurred in HandleBeginMessage of NHibernateMessageModule", e); 
     throw; 
    } 
} 

En regardant mon journal, nous consigner l'erreur suivante lorsque la méthode bind est appelée:

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) 

Apparemment, Il y a un problème avec l'accès au HttpContext. Est-ce que cet appel à configurer NServiceBus doit se produire plus tard dans le cycle de vie que Application_Start? Ou existe-t-il une autre solution de contournement que d'autres ont utilisée pour faire fonctionner les gestionnaires dans une application Web Asp.NET?

Merci, Steve

Répondre

1

Je ne voudrais pas utiliser WebSessionContext dans ce cas, précisément parce que NServiceBus peut fonctionner indépendamment de HttpContexts. Si vous souhaitez utiliser une implémentation de contexte de session unique pour le traitement des messages Web et NServiceBus, implémentez NHibernate.Context.ICurrentSessionContext avec un stockage hybride, c'est-à-dire si HttpContext.Current! = Null, utilisez HttpContext comme stockage de session. Sinon, utilisez un stockage local de thread. Ceci est similaire à ce que fait Castle ActiveRecord avec ses HybridWebThreadScopeInfo.

+0

Merci Mauricio, je vais tenter le coup. – SteveBering

+0

@SteveBering: Je parie que quelqu'un a déjà mis en œuvre ce que je décris –

+0

@MauricioScheffer: [Oui il y a] (http://stackoverflow.com/a/5871088/163507). – Rolf

Questions connexes