1

次のシナリオがあります。

  1. 最初にデータベースに何かを書き込みます
  2. バスでメッセージを送る

これらをアトミック アクションのように実行したい、つまりトランザクションで実行したいのですが、実際に分散されていると動作しません。ローカル マシンではすべてが正常に機能していましたが、サービスが別のマシン上にあるとすぐに動作しなくなりました。

私のコードは次のようになります。

using(var ts = new TransactionScope())
{
    // Write something to db
    _bus.Send(SomeMessage);
    ts.Complete();
}

クライアント、サーバー、およびデータベースでインバウンドとアウトバウンドを有効にして DTC を有効にし、ポート DCOM プロトコルを 5000-6000 に設定するなど、考えられることと情報を見つけることができるすべてのことを行いました。私が得るエラーは次のとおりです。

 FailedToSendMessageException: "Failed to send message to address: myserver"

スタックトレースは次のとおりです。

at NServiceBus.Transports.Msmq.MsmqMessageSender.ThrowFailedToSendException(Address address, Exception ex) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs:line 89
at NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage message, Address address) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs:line 80
at NServiceBus.Unicast.UnicastBus.SendMessage(List`1 addresses, String correlationId, MessageIntentEnum messageIntent, Object[] messages) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\UnicastBus.cs:line 658
at NServiceBus.Unicast.UnicastBus.SendMessage(Address address, String correlationId, MessageIntentEnum messageIntent, Object[] messages) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\UnicastBus.cs:line 583
at NServiceBus.Unicast.UnicastBus.NServiceBus.IBus.Send(Object[] messages) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\UnicastBus.cs:line 480
at Rapporteringsregisteret.Web.Controllers.RapporteringController.Post(OpprettRapportering opprettRapportering) in c:\dev\git\Rapporteringsregisteret\src\Rapporteringsregisteret.Web\Controllers\RapporteringController.cs:line 37
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)

なぜこれが機能しないのですか?

4

1 に答える 1

1

When running in a distributed scenario your endpoint mapping needs to explicitely define the machine name where the queue of the receiver is located. When running on the same box this is not necessary. Therefore your mapping should not contain "myserver" but "myserver@machinename". This error is not related to DTC. For future questions always include Nservicebus version number and transport layer

于 2013-09-24T21:06:32.140 に答える