简体   繁体   English

NServiceBus Transport 在使用自定义 ServiceHostFactory 时为 NULL,WAS

[英]NServiceBus Transport is NULL when using a custom ServiceHostFactory, WAS

We are currently trying to implement NServiceBus 3.0 in our WCF services.我们目前正在尝试在我们的 WCF 服务中实施 NServiceBus 3.0。

We use a custom ServiceHostFactory to initialize our services in WAS.我们使用自定义的 ServiceHostFactory 来初始化 WAS 中的服务。 We use.net.tcp to access the services and the following code to set it up:我们使用 .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;
    }
}

when we call the service we receive this error:当我们调用该服务时,我们收到此错误:

    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

And the config section in the web.configweb.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>

Any ideas about this?对此有什么想法吗?

Usually (at least in 2.6), you would pass the implementation of your Windsor Container to the .CastleWindsorBuilder configuration.通常(至少在 2.6 中),您会将 Windsor 容器的实现传递给.CastleWindsorBuilder配置。 This allows NSB to create the correct object graph when initializing.这允许 NSB 在初始化时创建正确的 object 图。 So, it would look like:所以,它看起来像:

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

Does that help?这有帮助吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在WCF服务库项目中使用自定义ServiceHostFactory - Using a custom ServiceHostFactory in a WCF Service Library project 使用NServiceBus设置学习传输时出现RabbitMQ错误 - RabbitMQ error when setting up Learning Transport with NServiceBus nservicebus 使用 msmq 传输发送具有列表类型属性的命令 object - nservicebus send command object with list type property using msmq transport 使用nServiceBus和AzureDataBus的空引用错误 - Null Reference error using nServiceBus and AzureDataBus 自定义ServiceHostFactory:找不到合同名称“ IMetadataExchange” - Custom ServiceHostFactory: The contract name 'IMetadataExchange' could not be found 使用发件箱和NHibernateStorageContext时的NServiceBus单元测试 - NServiceBus Unit testing when using Outbox and NHibernateStorageContext WCF:NetMsmq而不是Http的应用程序池挂起后,自定义ServiceHostFactory错误 - WCF: Custom ServiceHostFactory errors after Application Pool suspension for NetMsmq but not Http 使用NServiceBus时,MVVM中的ObservableCollection不变 - ObservableCollection not changing in MVVM when using NServiceBus 自定义ServiceHostFactory在Windows Server 2012和IIS 8.5上失败 - Custom ServiceHostFactory fails on Windows Server 2012 and IIS 8.5 使用signaler PersistentConnection和websockets传输进行自定义授权 - Custom Authorization using signalr PersistentConnection with websockets transport
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM