1

そのため、メッセージを MSMQ キューに送信するようにクライアント コードを構成しようとしています。ここで説明されている手順に従いました: https://msdn.microsoft.com/en-us/library/ms789008(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharpと私のクライアント コード以下のようになります。

class Program
{
    static void Main(string[] args)
    {
        var binding = new MsmqIntegrationBinding("MyMessagesBinding");
        var address = new EndpointAddress(@"msmq.formatname:DIRECT = OS:.\private$\MyMessages");
        var channelFactory = new ChannelFactory<IDataRelayService>(binding, address);
        var channel = channelFactory.CreateChannel();

        while (true)
        {
            var message = new MyMessage
            {
                Content = "this is content!!!",
                Id = "random uuid"
            };
            var msmqWrapper = new MsmqMessage<MyMessage>(message)
            {
                Priority = MessagePriority.Highest
            };

            channel.PassMessage(msmqWrapper);
            Console.WriteLine("message sent");
            Console.ReadLine();
        }
    }
}

App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <system.serviceModel>
    <client>
      <endpoint name="MyResponseEndpoint"
                address="msmq.formatname:DIRECT=OS:.\private$\MyMessages"
                binding="msmqIntegrationBinding"
                bindingConfiguration="MyMessagesBinding"
                contract="Client.IDataRelayService">
      </endpoint>
    </client>
    <bindings>
      <msmqIntegrationBinding>
        <binding name="MyMessagesBinding">
          <security mode="None" />
        </binding>
      </msmqIntegrationBinding>
    </bindings>
  </system.serviceModel>
</configuration>

IDataRelayService.cs:

[ServiceContract]
public interface IDataRelayService
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void PassMessage(MsmqMessage<MyMessage> message);
}

IDataRelayServiceChannel.cs:

public interface IDataRelayServiceChannel : IDataRelayService, System.ServiceModel.IClientChannel
{
}

問題なくコンパイルおよび実行されますが、evet ビューアーを開くと、MSMQ のイベントがログに記録されません。コンピュータ管理ツールを開いてキューを表示すると、キューに 0 メッセージが表示されます。ここで何が間違っていますか?

編集:

MSMQ のイベント トレースを有効にすると、イベント ビューアに次のように表示されます。

ここに画像の説明を入力

4

1 に答える 1

0

あなたの問題はほぼ確実にパーミッションに関連しています。

メッセージ送信者が実行されているサービス アカウントには、送信先のキューに対する次の MSMQ アクセス許可が必要です。

  • メッセージを送る
  • プロパティを取得
  • 権限を取得する

送信者が受信者とは異なるドメインにある場合は、ANONYMOUS_LOGON というローカル ユーザーにこれらのアクセス許可を付与する必要があります。

また、MSMQ E2E イベント ログを有効にします: https://technet.microsoft.com/en-us/library/cc730882(v=ws.11).aspx。これにより、何が起こっているかがわかります。

キューの両端に WCF がある場合は、msmqIntegrationBinding ではなく netMsmqBinding を使用する必要があります。

于 2016-12-12T16:42:26.317 に答える