2012-04-04 14 views
0

Wir versuchen derzeit, NServiceBus 3.0 in unseren WCF-Diensten zu implementieren.NServiceBus Transport ist NULL, wenn ein benutzerdefiniertes ServiceHostFactory verwendet wird, WAS

Wir verwenden eine benutzerdefinierte ServiceHostFactory, um unsere Dienste in WAS zu initialisieren. Wir verwenden net.tcp auf die Dienste zuzugreifen und den folgenden Code, um es einzurichten:

public class DoServiceServiceHostFactory : DefaultServiceHostFactory 
{ 
    private static IWindsorContainer _container; 

    public DoServiceServiceHostFactory() 
     : base(CreateKernel()) 
    { 
    } 

    private static IKernel CreateKernel() 
    { 
     _container = new WindsorContainer(); 

     IocModules.Configure(_container, new WcfConfigurationModule()); 
     IocModules.Configure(_container, new WcfAdapterModule()); 
     IocModules.Configure(_container, new ManagerModule()); 
     IocModules.Configure(_container, new FactoryModule()); 

     IBus bus = Configure.WithWeb() 
       .DefineEndpointName("OurProjectPublisher") 
       .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("MY.Bus.Contracts.Events")) 
       .CastleWindsorBuilder() 
       .Log4Net() 
       .XmlSerializer() 
       .MsmqTransport() 
       .UnicastBus() 
       .CreateBus() 
       .Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install()); 
     //_container.Register(Component.For<IBus>().Instance(bus).LifeStyle.Singleton); 

     WindsorServiceLocator serviceLocator = new WindsorServiceLocator(_container); 
     ServiceLocator.SetLocatorProvider(() => serviceLocator); 

     return _container.Kernel; 
    } 
} 

wenn wir den Service rufen erhalten wir diesen Fehler:

Object reference not set to an instance of an object. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object. 

Source Error: 


Line 33:    IocModules.Configure(_container, new FactoryModule()); 
Line 34: 
Line 35:    IBus bus = Configure.WithWeb() 
Line 36:      .DefineEndpointName("OurProjectPublisher") 
Line 37:      .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("MY.Bus.Contracts.Events")) 

Source File: xxx\ServiceHostFactory.cs Line: 35 

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.] 
    NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(Action startupAction) in d:\BuildAgent-03\work\nsb.masterbuild0\src\unicast\NServiceBus.Unicast\UnicastBus.cs:762 
    xxx.ServiceHostFactory.CreateKernel() in xxx\ServiceHostFactory.cs:35 
    xxx.ServiceHostFactory..ctor() in xxx\ServiceHostFactory.cs:21 

[TargetInvocationException: Exception has been thrown by the target of an invocation.] 
    System.RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo method, Object[] args, SignatureStruct& signature, RuntimeType declaringType) +0 
    System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +651 
    System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath) +1204 
    System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +50 
    System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +1132 

[ServiceActivationException: The service '/MembershipService.svc' cannot be activated due to an exception during compilation. The exception message is: Exception has been thrown by the target of an invocation..] 
    System.Runtime.AsyncResult.End(IAsyncResult result) +890624 
    System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +180062 
    System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +136 

Und die Config-Abschnitt in der web .config

<configSections> 
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
<section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" /> 
<section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" /> 
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
</configSections> 
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error" /> 
<MsmqTransportConfig NumberOfWorkerThreads="1" MaxRetries="5" /> 
<UnicastBusConfig ForwardReceivedMessagesTo="auditqueue"> 
<MessageEndpointMappings> 
    <add Messages="MY.Bus.Contracts" Endpoint="OurProjectPublisher" /> 
</MessageEndpointMappings> 
</UnicastBusConfig> 

diese Irgendwelche Ideen über?

+0

Fällt dies nur in WAS aus? Haben Sie diese Konfiguration mit einem normalen Host versucht? –

+0

Wenn wir den Dienst mit NET.TCP ausführen und eine Factory in der .svc-Datei verwenden, kann NServiceBus in der Factory-Implementierung nicht gestartet werden. Wenn wir die Init von NServiceBus nach global.asax verschieben und eine HTTP-Bindung verwenden, funktioniert es. –

Antwort

0

Normalerweise (mindestens in 2.6) würden Sie die Implementierung Ihres Windsor Containers an die .CastleWindsorBuilder Konfiguration übergeben. Dadurch kann NSB beim Initialisieren das richtige Objektdiagramm erstellen. So würde es wie folgt aussehen:

 _container = new WindsorContainer(); 

     IocModules.Configure(_container, new WcfConfigurationModule()); 
     IocModules.Configure(_container, new WcfAdapterModule()); 
     IocModules.Configure(_container, new ManagerModule()); 
     IocModules.Configure(_container, new FactoryModule()); 

     IBus bus = Configure.WithWeb() 
       .DefineEndpointName("OurProjectPublisher") 
       .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("MY.Bus.Contracts.Events")) 
       .CastleWindsorBuilder(_container) // added here 
       .Log4Net() 
       .XmlSerializer() 
       .MsmqTransport() 
       .UnicastBus() 
       .CreateBus() 
       .Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install()); 
     //_container.Register(Component.For<IBus>().Instance(bus).LifeStyle.Singleton); 

diese Hilfe tut?

+0

Nein, ich habe das vorher versucht, habe vergessen, es zurück zu setzen -> Danke, dass du es aufgezeigt hast, aber das Problem bleibt bestehen. –

+0

@BjornBailleul Und ich nehme an, dass Sie Konfigurationsbereich für 'MsmqTransportConfig' definiert haben? –

+0

Ja, ich habe den relevanten web.config-Teil oben hinzugefügt –