0

私は、Nservicebus を IIS でホストする必要があるプロジェクトに取り組んできました。メッセージを送信するには MVC3 Web アプリケーションが必要です。nservicebus ホストはこのメッセージを処理してから、何らかのメッセージを Web アプリケーションに送り返す必要があります。

非同期ページの例http://docs.particular.net/samples/web/asp-mvc-application/ は、それを行う 1 つの方法を示しています。私はこれを機能させることができますが、これは私の要件を完全には満たしていません。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」キューに表示されます。ただし、webapplication 内のハンドラーはトリガーしません。これはコードです:

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 に答える