【问题标题】:Sending message to msmq queue via msmqIntegrationBinding通过 msmqIntegrationBinding 向 msmq 队列发送消息
【发布时间】:2017-04-27 06:43:12
【问题描述】:

所以我正在尝试配置我的客户端代码以将消息发送到 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 启用了事件跟踪,这是事件查看器向我显示的内容:

【问题讨论】:

  • 听起来邮件正在存储在发件人机器上。检查客户端计算机上的 MSMQ 服务,并查找临时出站队列。你的消息应该在上面。
  • 我怎么看出来的?我正在查看计算机管理/消息队列,我发现队列中没有消息。您是在谈论其他工具吗?
  • 您在查看传出队列吗?
  • 传出队列为空 :(
  • 你确定在接收机器上启用了 MSMQ 事件日志?

标签: c# wcf msmq msmqintegrationbinding


【解决方案1】:

您的问题几乎肯定与权限有关。

运行消息发送方的服务帐户必须对其尝试发送到的队列具有以下 MSMQ 权限:

  • 发送消息
  • 获取属性
  • 获取权限

如果您的发件人与您的收件人位于不同的域中,您需要将这些权限授予名为 ANONYMOUS_LOGON 的本地用户。

另外,启用 MSMQ E2E 事件日志记录:https://technet.microsoft.com/en-us/library/cc730882(v=ws.11).aspx。这应该告诉你发生了什么。

如果队列的两端都有 WCF,则应该使用 netMsmqBinding 而不是 msmqIntegrationBinding。

【讨论】:

  • 我所有的代码和 msmq 队列都在一台机器上。我在提升的权限下运行我的消息发件人。
  • @SzwornyDziąch - 检查队列权限。授予您正在运行的帐户对队列的完全控制权。
  • 好的,明天我回来工作时会做,如果有效 - 接受这个答案。
  • 我向每个用户授予了所有权限并打开了事件日志记录。我仍然不知道发生了什么:)。请查看我更新的问题。
  • @SzwornyDziąch 你能在接收机器上查看死信或事务死信队列吗?你的消息在吗?
猜你喜欢
  • 2018-02-02
  • 2012-02-12
  • 2013-03-30
  • 2012-05-20
  • 2012-10-20
  • 1970-01-01
  • 2013-04-02
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多