我们目前正在尝试在我们的WCF服务中实施NServiceBus 3.0。
我们使用自定义ServiceHostFactory在WAS中初始化我们的服务。我们使用net.tcp访问服务和以下代码进行设置:
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;
}
}
当我们调用该服务时,我们收到此错误:
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
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>
有关于此的任何想法吗?
答案 0 :(得分:0)
通常(至少在2.6中),您可以将Windsor容器的实现传递给.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);
这有帮助吗?