C# 通过msmqIntegrationBinding向msmq队列发送消息

C# 通过msmqIntegrationBinding向msmq队列发送消息,c#,wcf,msmq,msmqintegrationbinding,C#,Wcf,Msmq,Msmqintegrationbinding,所以我试图配置我的客户端代码,以便将消息发送到MSMQ队列。我遵循了此处描述的步骤:我的客户端代码如下所示: class Program { static void Main(string[] args) { var binding = new MsmqIntegrationBinding("MyMessagesBinding"); var address = new EndpointAddress(@"msmq.formatname:DIRECT

所以我试图配置我的客户端代码,以便将消息发送到MSMQ队列。我遵循了此处描述的步骤:我的客户端代码如下所示:

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();
        }
    }
}
它编译和运行没有问题,但当我打开evet viewer时,MSMQ没有记录任何事件。如果我打开计算机管理工具查看队列,它会在我的队列中显示0条消息。我做错了什么

编辑:

我为MSMQ启用了事件跟踪,下面是事件查看器显示的内容:


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

运行邮件发件人的服务帐户在其尝试发送到的队列上必须具有以下MSMQ权限:

  • 发送消息
  • 获取属性
  • 获取权限
如果您的发件人与收件人位于不同的域,则需要将这些权限授予名为ANONYMOUS\u LOGON的本地用户

另外,启用MSMQ E2E事件日志记录:。这应该告诉你发生了什么


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

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

运行邮件发件人的服务帐户在其尝试发送到的队列上必须具有以下MSMQ权限:

  • 发送消息
  • 获取属性
  • 获取权限
如果您的发件人与收件人位于不同的域,则需要将这些权限授予名为ANONYMOUS\u LOGON的本地用户

另外,启用MSMQ E2E事件日志记录:。这应该告诉你发生了什么



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

这听起来像是邮件被存储在发送方机器上。检查客户端计算机上的MSMQ服务,并查找临时出站队列。你的留言应该在上面,我怎么能看到?我正在查看计算机管理/消息队列,发现队列中没有任何消息。您是否正在谈论其他工具?您是否正在查看传出队列?传出队列为空:(而且您确实在接收方计算机上启用了MSMQ事件日志?听起来消息好像存储在发送方计算机上。请检查客户端计算机上的MSMQ服务,并查找临时出站队列。您的消息应该在该队列上。我怎么能看到?我正在查看计算机管理/消息队列,但没有看到我。)消息被保存在我的队列中。您是否正在谈论其他工具?您是否正在查看传出队列?传出队列为空:(而且您肯定在接收方计算机上启用了MSMQ事件日志?我的所有代码和MSMQ队列都在一台计算机上。我在提升权限下运行我的消息发送方。@SzwornyDziąch-检查队列权限。授予您运行的帐户对队列的完全控制权。好的,明天我回来工作时,如果它不存在,我会这样做。)rks-接受这个答案。我向每个用户授予了所有权限并打开了事件日志记录。但我仍然不知道发生了什么:)。请查看我更新的问题。@SzwornyDziąch您可以查看接收计算机上的死信队列或事务死信队列吗?您的邮件在吗?我的所有代码和msmq队列都在一台计算机上。我正在以提升的权限运行我的邮件发件人。@SzwornyDziąch-检查队列权限。授予您正在运行的帐户在对队列的完全控制下。好的,明天我回来工作时会这样做,如果可行的话-接受这个答案。我向每个用户授予了所有权限并打开了事件日志记录。但我仍然不知道发生了什么:)。请查看我更新的问题。@SzwornyDziąch您可以查看接收机器上的死信或事务死信队列吗?您的邮件在那里吗?
<?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>
[ServiceContract]
public interface IDataRelayService
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void PassMessage(MsmqMessage<MyMessage> message);
}
public interface IDataRelayServiceChannel : IDataRelayService, System.ServiceModel.IClientChannel
{
}