私は、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 オブジェクトでも、ハンドラーがロードされていることがわかります。