2012-04-04 2 views
0

현재 WCF 서비스에 NServiceBus 3.0을 구현하려고합니다.사용자 지정 ServiceHostFactory, WAS를 사용할 때 NServiceBus 전송이 NULL입니다.

사용자 정의 ServiceHostFactory를 사용하여 WAS에서 서비스를 초기화합니다. 우리는 서비스에 액세스 할 수 net.tcp 사용하고 다음 코드를 설정 :

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 

그리고 웹에서 설정 섹션 : 우리는 서비스를 호출 할 때

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

우리가이 오류가 .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> 

어떤 아이디어가 있습니까?

+0

WAS에만 문제가 있습니까? 정규 호스트를 사용하여이 구성을 시도 했습니까? –

+0

NET.TCP를 사용하여 서비스를 실행하고 .svc 파일의 팩토리를 사용하면 NServiceBus가 팩토리 구현에서 시작되지 않습니다. NServiceBus의 init을 global.asax로 옮기고 HTTP 바인딩을 사용하면 작동합니다. –

답변

0

보통 (적어도 2.6 이상) Windsor Container 구현을 .CastleWindsorBuilder 구성으로 전달합니다. 이를 통해 NSB는 초기화 할 때 올바른 객체 그래프를 생성 할 수 있습니다. 그러면 다음과 같이 보입니다 :

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

그게 도움이 되나요?

+0

아니요. 이전에 해 보았습니다. 다시 넣어 주신 것을 잊어 버렸습니다.> 지적 해 주셔서 고맙지 만 문제는 여전히 남아 있습니다. –

+0

@BjornBailleul 그리고'MsmqTransportConfig'에 대해 정의 된 설정 섹션이 있다고 가정하고 있습니까? –

+0

예, 위의 web.config 관련 부분을 추가했습니다. –

관련 문제