0

我一直在从事一个需要将 Nservicebus 托管在 IIS 中的项目。我需要 MVC3 Web 应用程序来发送消息,nservicebus 主机应该处理此消息,然后将某种消息发送回 Web 应用程序。

异步页面示例http://docs.particular.net/samples/web/asp-mvc-application/ 显示了一种方法。我可以让它工作,但这并不能完全满足我的要求。我需要从处理程序返回一个对象,而不仅仅是一个 int。

为了让它工作,我尝试在 IIS 下设置一个主机,在我的 Global.asax 中我有这个代码:

Bus = Configure.WithWeb()                
               .DefineEndpointName("CQRS")
               .Log4Net()                   
               .DefaultBuilder()                
               .DisableTimeoutManager()                
               .XmlSerializer()
               .MsmqTransport()
                   .IsTransactional(true)
                   .PurgeOnStartup(false)
                   .InMemorySubscriptionStorage()
               .UnicastBus()              
                   .AllowSubscribeToSelf()
                   .ImpersonateSender(false)
                   .LoadMessageHandlers()  
                   .CreateBus().Start();  

我的 web.config:

<MessageForwardingInCaseOfFaultConfig ErrorQueue="CQRS.error" />
 <MsmqTransportConfig NumberOfWorkerThreads="1" MaxRetries="5"  />

 <UnicastBusConfig  DistributorControlAddress="" DistributorDataAddress="" TimeoutManagerAddress="CQRS.timeouts">
  <MessageEndpointMappings>
     <add Messages="Nokavision.InvoiceProcessing.CQRS.Messages" Endpoint="CQRS" />
     <add Messages="NServiceBus.Scheduling.Messages.ScheduledTask" Endpoint="CQRS" />      
  </MessageEndpointMappings>
</UnicastBusConfig>

使用 Bus 对象发送消息效果很好,一条消息出现在“cqrs”队列中。但是,Web 应用程序中的处理程序不会触发。这是代码:

public class UpdateInkoopFactuurAlgemeenHandler : IHandleMessages<UpdateInkoopFactuurAlgemeenCommand>
{
    public IBus Bus { get; set; }

    public void Handle(UpdateInkoopFactuurAlgemeenCommand message)
    {
        P2PEntities entities = new P2PEntities();

        var factuur = (from f in entities.Documenten.OfType<InkoopFactuur>()
                       where f.DocumentId == message.DTO.DocumentId
                       select f).FirstOrDefault();

        if (factuur != null)
        {
            factuur.FactuurNummer = message.DTO.FactuurNummer;
            entities.SaveChanges();
        }

        //Bus.Return(new UpdateInkoopFactuurAlgemeenResponse(message.DTO.ClientConnectionId));

    }
}

我确定我在这里遗漏了一些小东西,但是我做错了什么,为什么处理程序没有被触发,而我可以清楚地看到队列中的一条消息。同样在 Bus 对象上,我可以看到正在加载的处理程序。

4

2 回答 2

1

如果您在流利的配置中正确配置安装程序,则 NSB 会正确设置队列的权限。 http://andreasohlund.net/2012/01/26/installers-in-nservicebus-3-0/

于 2012-08-07T04:55:08.420 回答
0

好的,我想我明白了,NSB 创建的队列似乎没有 IIS USER 的完全访问权限。我已经为每个队列上的每个人设置了“完全控制”并重新启动了 IIS。不知何故它现在似乎工作

于 2012-07-31T07:00:57.400 回答